int p; //这是一个普通的整型变量
int *p; //首先从P 处开始,先与*结合,所以说明P 是一
//个指针,然后再与int 结合,说明指针所指向
//的内容的类型为int 型.所以P 是一个返回整
//型数据的指针
int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数
//组,然后与int 结合,说明数组里的元素是整
//型的,所以P 是一个由整型数据组成的数组
int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级
//比*高,所以P 是一个数组,然后再与*结合,说明
//数组里的元素是指针类型,然后再与int 结合,
//说明指针所指向的内容的类型是整型的,所以
//P 是一个由返回整型数据的指针所组成的数组
int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针
//然后再与[]结合(与"()"这步可以忽略,只是为
//了改变优先级),说明指针所指向的内容是一个
//数组,然后再与int 结合,说明数组里的元素是
//整型的.所以P 是一个指向由整型数据组成的数
//组的指针
int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然
//后再与*结合,说明指针所指向的元素是指针,然
//后再与int 结合,说明该指针所指向的元素是整
//型数据.由于二级指针以及更高级的指针极少用
//在复杂的类型中,所以后面更复杂的类型我们就
//不考虑多级指针了,最多只考虑一级指针.
int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入
//()里分析,说明该函数有一个整型变量的参数
//然后再与外面的int 结合,说明函数的返回值是
//一个整型数据
Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与
//()结合,说明指针指向的是一个函数,然后再与()里的
//int 结合,说明函数有一个int 型的参数,再与最外层的
//int 结合,说明函数的返回类型是整型,所以P 是一个指
//向有一个整型参数且返回类型为整型的函数的指针
int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂
//从P 开始,先与()结合,说明P 是一个函数,然后进
//入()里面,与int 结合,说明函数有一个整型变量
//参数,然后再与外面的*结合,说明函数返回的是
//一个指针,,然后到最外面一层,先与[]结合,说明
//返回的指针指向的是一个数组,然后再与*结合,说
//明数组里的元素是指针,然后再与int 结合,说明指
//针指向的内容是整型数据.所以P 是一个参数为一个
//整数据且返回一个指向由整型指针变量组成的数组
//的指针变量的函数.
指针和函数的关系
可以把一个指针声明成为一个指向函数的指针。
int fun1(char *,int);
int (*pfun1)(char *,int);
pfun1=fun1;
int a=(*pfun1)("abcdefg",7); //通过函数指针调用函数。
可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来
作为实参。
例十四:
int fun(char *);
inta;
char str[]="abcdefghijklmn";
a=fun(str);
int fun(char *s)
{
int num=0;
for(int i=0;;)
{
num+=*s;s++;
}
return num;
}
这个例子中的函数fun 统计一个字符串中各个字符的ASCII 码值之
和。前面说了,数组的名字也是一个指针。在函数调用中,当把str
作为实参传递给形参s 后,实际是把str 的值传递给了s,s 所指向的
地址就和str 所指向的地址一致,但是str 和s 各自占用各自的存储空
间。在函数体内对s 进行自加1 运算,并不意味着同时对str 进行了自
加1 运算。
什么类型的函数,指的,就是返回值是什么类型的函数而已
所以所谓指针函数,说的只是返回值是指针的函数而已
如:返回值是整形指针的整形指针函数fun()的定义:
int * fun(参数)
返回指针的作用,跟返回其他的如整形int,浮点型float等的作用也一样
作用都是把返回值反馈给原调用函数
原调用函数需要指针,就用指针作为返回值
想要理解指针函数的意义,首先要理解什么是指针
因为指令在电脑里存储都是要编址的,由地址来找出需要的数据,所以定义指针,为了方便查找。谢谢