char *p,这定义了一个指针,指针指向的数据类型是字符型,char *(p)定义了一个指针P;
char *p[4], 为
指针数组
,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型。所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组。
char(*p)[4],为
数组指针
,强制改变优先级,*先与p结合,使p成为一个指针,这个指针指向了一个具有4个char型数据的数组。故p中存放了这个char型数组的首地址,可用数组指针动态内存申请:
char (*p)[10];
p=(char*)malloc(sizeof(char[x])*N);
char *f(char,char),为
指针函数
,()的优先级高于*,故f先与()结合,成为函数f(),函数的返回值是char *类型的,故返回值是一个指针。
char (*f)(char,char),为
函数指针
,*与f结合成为一个指针,这个指针指向函数的入口地址。函数名就是函数的首地址。函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
以后如果要调用函数func(),也就可以这样调用:(*f)();
二级指针
简单来说就是指向指针的指针。
char a=200;
char *p;
char **q;//q是一个二级指针
p=&a;
q=&p; //q指向指针p
假设变量a在内存中的地址为2000H,
指针p指向a,p的值是2000H,*p就是取地址2000H中的值即a为200,而p本身的地址是4000H,q指向指针p,*q就是取地址4000H中的值即p的值为2000H,而**q就是取地址2000H中的值即200。所以:
*p==200;
*q=2000H;
**q=200;
以上的q是一个指针指针的二级指针,然而还有指向数组的二级指针。