像连着的两个词,前面一个通常是修饰部分,中心词是后面的一个词
-
常量指针和指针常量
常量指针:指向常量的指针,指针指向的地址内容不可修改
指针常量:指针是常量,它是不可改变地址的指针
举例:
char* const p1;
const char* p2;
char const * p3;
如何判断上述两个变量是常量指针还是指针常量,看靠近变量近的是什么const 还是 *。谁离变量近,谁就在名称后面。比如char* const p1,靠近p1近的是const(常量),那它就是指针常量;const char* p2,靠近p2近的是*(指针),那它就是常量指针,同样p3也是常量指针。 -
指针数组和数组指针
指针数组:元素是指针的数组;
数组指针:指向数组的指针;
举例:
int *a[10];
int (*a)[10]);
如何判断上述两个变量是指针数组还是数组指针。根据右左原则,看变量先和数组[]还是指针*结合
右左原则:
首先从未定义的标识符(定义的变量名)开始阅读;
再从最里面的圆括号看起,遇到右括号时调转阅读方向,看左边的;
解析完里面括号里面所有的东西,就跳出圆括号;然后再往右看,右边看完,再往左看。
看int *a[10],首先a跟[10]结合,所以a实质是个数组,根据起名原则,中心词都是再后面,所以int *a[10]是指针数组:一个存放了10个int型指针元素的数组。
再看int (*a)[10]);首先a往右是右括号,看左边,是*,所以a实质是个指针,根据起名原则,所以int (*a)[10])是数组指针:指向一个长度为10、类型为int的数组 -
指针函数和函数指针
指针函数:返回指针的函数,本质是函数
函数指针:指向函数的指针
举例:
int *fun(int* a, int b) { return a+b; }
int (*p)(int, int);
指针函数本质是函数,其定义是:
返回类型标识符 *返回名称(形参列表) {函数体}
且fun首先和函数标识()所以int *fun(int* a, int b) { return a+b; }是指针函数
int (*p)(int, int)可见p是与*结合,所以int (*p)(int, int)是函数指针,pp一个指向int (*fun)(int x, int y)类型的函数指针,该函数有两个整形参数并返回一个整型数