大家好这里是指针乐园下,下面我们开始喽!!
文章目录
-
目录
文章目录
前言
一、字符以及数组指针
二、函数指针变量以及函数指针数组
函数指针变量的使⽤
通过函数指针调⽤指针指向的函数。
函数指针数组
总结
前言
我们今天会学习数组指针,字符指针,和函数指针。
提示:以下是本篇文章正文内容,下面案例可供参考
一、字符以及数组指针
字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ;
int main()
{
char ch = 'w';
char *pc = &ch;
*pc = 'w';
return 0;
}
//int main()
//{
// const char* pstr = "hahahahaha";//这⾥是把⼀个字符串放到pstr指针变量⾥了
// printf("%s\n", pstr);
//return 0;
//}
代码 const char* pstr = "hello bit."; 特别容易让同学以为是把字符串 hello bit 放 到字符指针 pstr ⾥了,但是本质是把字符串 hello bit. ⾸字符的地址放到了pstr中。
数组指针变量
之前我们学习了指针数组,指针数组是⼀种数组,数组中存放的是地址(指针)。 数组指针变量是指针变量?还是数组? 答案是:指针变量。 我们已经熟悉:
• 整形指针变量: int * pint; 存放的是整形变量的地址,能够指向整形数据的指针。
• 浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点型数据的指针。 那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。
思考一下,这两个分别是什么?
p先和*结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。所以 p是⼀个指针,指向⼀个数组,叫 数组指针。 这⾥要注意:[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合。
那么数组指针如何初始化呢
数组指针变量怎么初始化 数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的 &数组名 。
二、函数指针变量以及函数指针数组
函数指针变量
函数指针变量的创建 什么是函数指针变量呢? 根据前⾯学习整型指针,数组指针的时候,我们的类⽐关系,我们不难得出结论: 函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。 那么函数是否有地址呢? 我们做个测试:
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("test: %p\n", test);
printf("&test: %p\n", &test);
return 0;
}
}
输出结果:
test: 005913CA
&test: 005913CA
确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的⽅ 式获得函数的地址。 如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针 ⾮常类似。如下:
void test() { printf("hehe\n"); } void (*pf1)() = &test; void (*pf2)()= test; int Add(int x, int y) { return x+y; } int(*pf3)(int, int) = Add; int(*pf3)(int x, int y) = &Add;/x和y写上或者省略都是可以的
函数指针变量的使⽤
通过函数指针调⽤指针指向的函数。
#include <stdio.h>
int Add(int x, int y)
{
return x+y;
}
int main()
{
int(*pf3)(int, int) = Add;
printf("%d\n", (*pf3)(2, 3));
printf("%d\n", pf3(3, 5));
return 0;
}
输出结果:
5
8
函数指针数组
数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组, ⽐如:
那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
int (*parr1[3])();
int *parr2[3]();
int (*)() parr3[3];
答案是:parr1 parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢? 是 int (*)() 类型的函数指针。
总结
数组大概是这个样子,后续我会慢慢完善的