int a
a一个int类型的变量
int* p
p是一个指针变量,指向int类型对象
const关键字,除非右边是一个类型说明符,那么它作用于该类型说明符,否则作用于左边的符号
const int * p
这里const右边是int类型说明符,所以作用于int,a是一个指针变量,指向const的int类型变量
*p=1这样使用将会报错,因为指向的那个变量是只读的,无法修改
int const * p
这里的const右边是 * 符号,所以const也是作用于左边的int符号,结果同上
int * const p
这里的这里的const右边是p,所以const是作用于左边的*符号
*p=1没问题;p=&a 错误,因为const作用的是*符号,表示该指针变量是只读的,无法修改
再看一些其他的
char ** p1; // p1是指针,指向一个指针x,x指向char
const char **p2; // p2是指针,指向一个指针x,x指向一个const char
char * const * p3; // p3是指针,指向一个const指针x,x指向char
const char * const * p4; // p4是指针,指向一个const指针x,x指向一个const char
char ** const p5; // p5是const指针,指向一个指针x,x指向一个 char
const char ** const p6; // p6是const指针,指向一个指针x,x指向一个const char
char * const * const p7; // p7是一个const指针,指向一个const指针x,x指向一个char
const char * const * const p8; // p8是一个const指针,指向一个const指针x,x指向一个const char
再看些其他简单的声明
int p[3]
p是一个数组,数组的每一个元素是int类型
int*p[3]
p是一个数组,数组的没一个元素是int*指针类型
int(*p)[3]
p是一个指针,指针指向一个int[3]数组,数组的每一个元素是int类型
int (*p)()
p是一个指针,指针指向一个返回int类型的函数
上面这些简单的声明,都比较清楚,基本一眼就能看出来
下面来一个复杂的
int * (* (*fp1) (int) ) [10];
有一个简单的识别规则,从标识符开始,往右边结合,遇到左括号再向左结合,当前括号结束以后,再跳到外层的括号从新开始一轮的结合
1、标识符fp1
2、右边没有其他运算符,只有一个)括号,所以向左结合 遇到一个*,说明这是一个指针,指向哪里呢?
3、再往左只有一个(括号 跳到外面,继续往由 看到一个(int) ,说明这是一个函数,所以结合第2步 这是一个指向函数的指针,函数参数是int类型
4、往右又是一个括号,则往左结合,是一个*号,说明该函数返回的是一个指针,那么返回的指针指向哪里呢?
5、往左遇到(,再跳到外面,往右结合,说明这个指针指向一个10个元素的数组,数组的元素是什么呢?
6、往左结合,看到一个* ,说明数组元素是指针,并且指向的是int类型
所以总结,这是一个函数指针,函数返回一个指向含有10个元素的数组指针,并且该数组元素都是int*类型
同样的方法,看下面几个例子
int *( *( *arr[5])())(); 是一个指针数组,每一个指针指向函数,函数返回的也是一个指针,指针指向的又是一个函数,函数又返回的是指针
float ( * ( *b()) [] )(); 是一个函数,该函数返回一个指针,指针指向的是一个数组,数组的每一个元素又是一个指针,指向一个返回float的函数
void * ( *c) ( char, int (*)()); 是一个指针,指针指向一个函数,并返回一个void *指针,函数的参数有2个,一个是char类型,另一个是函数指针(函数返回的是int类型,函数没有参数)
void ** (*d) (int &, char **(*)(char *, char **)); 是一个指针,指针指向一个函数,函数返回的是一个指针,返回的指针指向一个void*指针,函数有2个参数,一个是引用类型int ,
另一个参数是是函数指针,被指的函数,有两个参数,一个是char*, 另一个是char**, 函数返回char**
float ( * ( * e[10]) (int &) ) [5]; 是一个数组,数组的每一个元素是指针,指针指向一个函数,函数参数是int& ,函数返回的是又是一个指针,指针指向数组,数组每一个元素是float类型
标签:10,const,指向,int,C语言,char,一个,指针 From: https://www.cnblogs.com/fuyun2000/p/17958328