指针数组与数组指针
指针数组:指针的数组,一个全是指针类型的数组
数组指针:数组的指针,一个指向数组的指针
表达方式
因为优先级的问题 ( )>[ ]> *
所以在表达方面会有所偏差
指针数组
int * p1 [ ] 因为[ ]的优先级大于*,所以变量名p1会首先与[ ]结合形成一个数组,然后int *表示的是数组中储存元素的类型
一些实例:
数组指针
int (p2) [ ] 因为()的优先级大于[ ],所以p2与结合,表示这是一个指针,指向的是一个数组,这个数组内存放的是int类型的元素
一些实例:
总结:
数组指针是一个指针变量,占有内存中一个指针的存储空间;
指针数组是多个指针变量,以数组的形式存储在内存中,占有多个指针的存储空间。
int arr[5]={1,2,3,4,5}; int (*p1)[5] = &arr; /下面是错误的/ int (*p2)[5] = arr;
&arr与arr的区别
数组名arr代表首元素的地址,&arr表示的整个数组的首地址,取值都相同,但是步长不同,在int arr[5]中arr+1是跳过4个字节,即一个元素,而&arr+1则跳过整个数组,即4*5=20个字节
而上面代码报错的原因是,在 C 语言中,赋值符号“=”号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。在这里,p1 和 p2 都是数组指针,指向的是整个数组。p1 这个定义的“=”号两边的数据类型完全一致,而 p2 这个定义的“=”号两边的数据类型就不一致了(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。
函数指针与指针函数
指针函数
指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
声明格式为:类型说明符 * 函数名 (参数)
int fun(int x,int y);
这种其实就是一个函数,然后返回值是一个 int 类型,是一个数值。
int *fun(int x,int y);
这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。
所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。
函数指针
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名) (参数)
int (*fun)(int x,int y);
函数指针是需要把一个函数的地址赋值给它,有两种写法:
fun = &Function;
fun = Function;
取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,例如数组名即代表数组的首元素位置。
调用函数指针的方式也有两种:
x = (*fun)();
x = fun();
两种方式均可,其中第二种看上去和普通的函数调用没啥区别。
两者区别
1,定义不同
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
2,写法不同
指针函数:int* fun(int x,int y);
函数指针:int (fun)(int x,int y);
可以简单粗暴的理解为,指针函数的是属于数据类型的,而函数指针的星号是属于函数名的。
再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。
3,用法不同
版权归原作者 at小嘿丶 所有, 如有侵权,请联系我们删除。