1 指向函数的指针与返回值为指针的函数:
1.1指针函数的指针:返回值类型 (*func) (参数列表)要求被调用的各个函数的参数的个数、类型及返回值类型都相同,这样就可以定义一个统一的处理函数,而入口参数就是指向函数的指针和具体的参数。调用时将实际的参数和函数名传递就可以了
1.2 返回值为指针的函数:返回值类型 *func(参数列表)
2 指针数组和指向指针的指针:
2.0指针与数组的用法:int a[10],*p;p=a;
A:p+i=a+i=&a[i],但可以p++而不可以a++因为a是数组的首地址是个常量;*p++=*(p++)因为*与+优先级相等,从右到左
B:同等条件下指针操作速度快效率高。
C:做函数参数时,数组名和长度作为两个参数。实参和形参都可以用数组或者指针,但注意指针做实参时必须先指向数组,否则编译出错。如
{int *P,n; fun(p,n); void fun(int a[],int t) ...}因为实参指针没有指向任何变量。
2.1 int a[m][n],(*P)[n];p=a; P=a=a+0=&a[0]
p+m=&a[m];
*(p+m)=&a[m][0] //变为列地址
*(p+m)+i=&a[m][i]
*(*(p+m)+i)=a[m][i]
2.2 指针数组:类型名 *指针名[数组长度]
指针数组的每一个元素是一个(类型名*)的地址,特别适合用来存储若干个字符串(虽然用二维数组也可以,但因为各个字符串的长度不等,而二维数组列数必须是确定的,这样就必须定义按照最长的那个字符串来定义列数,这样会造成空间的浪费,所以用指针数组就可以很好的解决这个问题)。如char *parry[]数组的长度也就是记录的条数,可以预先不指定。parry=parry+0=&parry[0]
2.3指向指针的指针 :类型名**p,相当于 类型名*(*p)
指针的指向元素的内容是一个指针,其实和指针数组地位时相同的,因而可以p=arry+i,printf("%s ",*p),其结果为arry[i]的内容