1 字符指针
字符指针是指向字符型变量的指针,它在不同情况下,使用也会有所不同
第一种情况:
int main()
{
char c = 'a';
char* pc = &c;
return 0;
}
在这里定义了一个字符变量 c 并赋值为 ‘a’ ,使字符指针 pc 指向了它
图示:

第二种情况:
int main()
{
char str[] = "abcdef";
char* p = str; //str为数组名,没有Sizeof, &, 是首元素地址
}
这里定义了一个字符数组 str ,它通过常量字符串 “abcdef” 来进行赋值,使用 p 指向了 str 的首元素地址

第三种情况:
int main()
{
char* pc = "abcdef";
}
这里定义了一个字符指针 pc ,使它指向了字符串 “abcdef” 的首元素,或称,保存了首元素的地址,而不是将字符串 “abcdef” 保存到了 pc 内部
图示:

由于 “abcdef” 是字符常量,所以是无法被更改的,如果要通过 * (解引用操作符) 操作指针对字符串进行修改,那么编译器会报错
示例:
int main()
{
char* pc = "abcdef";
*pc = 'w';
return 0;
}
进行调试会出现如下错误:

2 函数指针
变量和数组都有指针,函数也得有自己的指针
既然函数也有指针,那么函数的地址怎么获得呢?
函数的地址,可以通过 &函数名 ,函数名 两个方式获得
2.1 函数指针的定义
示例:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
printf("%p\n", &add); //&函数名
printf("%p\n", add); //函数名
return 0;
}
运行结果:

知道了怎么获得函数的地址,接下来说说函数指针该怎么写
直接上代码:
int add(int x, int y)
{
return x + y;
}
int main()
{
int (*pf) (int, int) = add;
return 0;
}
在这里,定义了函数 add 与函数指针 pf
理解方式如图:

2.2 函数指针的使用
如果要通过函数指针来调用函数,可以在指针变量前加上 * (解引用操作符),也可以不加
示例:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int (*pf) (int, int) = add;
printf("%d\n", pf(2, 3)); //不加* 调用
printf("%d\n", (*pf)(2, 3)); //加* 进行调用
return 0;
}
运行结果:

如果使用函数指针来调用函数,那么被调用的函数就被称为回调函数
3 函数指针数组
3.1 函数指针数组的定义
直接上代码:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int mul(int x, int y)
{
return x * y;
}
int div(int x, int y)
{
return x / y;
}
int main()
{
int (*pfArr[4]) (int, int) = { add, sub, mul ,div }; //函数指针数组pfArr
return 0;
}
如上方代码所示,定义了一个函数指针数组 pfArr ,里面保存了四个函数的地址,分别是add,sub,mul,div
函数指针数组定义的理解方式:

3.2 函数指针数组的使用
要访问函数指针数组的内容,只需要使用下标即可,调用对应函数时,若有参数则需要给入参数
示例:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int mul(int x, int y)
{
return x * y;
}
int div(int x, int y)
{
return x / y;
}
int main()
{
int (*pfArr[4]) (int, int) = { add, sub, mul ,div };
printf("%d\n", pfArr[0](4, 2));
printf("%d\n", pfArr[1](4, 2));
printf("%d\n", pfArr[2](4, 2));
printf("%d\n", pfArr[3](4, 2));
return 0;
}
运行结果:

&spm=1001.2101.3001.5002&articleId=149486405&d=1&t=3&u=6e9054d066024049aeee2a1c2afad0b6)
624

被折叠的 条评论
为什么被折叠?



