数组指针和指针数组
以下两个谁是数组指针,谁是指针数组
int * a[5] 和 int (*a)[5]
可以看出的是,他们只相差一个括号,由于运算符的结合,括号和方括号是同级,根据结合方向,a会先与[ ]结合,加了括号,a则先与 * 结合。加括号为的是改变运算的结合顺序。
int * a[5];//没有括号,a先与[5]结合,先是个数组 ,然后 int*变成一个整体
int (*a)[5];//加了括号,a先和结合,先是个指针, 然后和 int 和 [5]组合
故:
int * a[5]是指针数组,本质上是一个数组,数组里存放的元素是指针,指针的类型是int *,有五个成员。
int (*a)[5]是数组指针,本质上是一个指针,但里面存放的是一个指针,在这里 a存放的是一个指向5个整数型数组的指针
指针数组
int i;
int a = 10,b=20,c=30,d=40,e=50;
int *buf1[5] = {&a,&b,&c,&d,&e};
for(i = 0; i < 5; i++)
{
printf("buf1[%d]:%d\n",i, *buf1[i]);
}
//输出结果:
buf1[0]:10
buf1[1]:20
buf1[2]:30
buf1[3]:40
buf1[4]:50
buf1是数组,是指向数组首地址的所以可以直接下标取出内容,内容是一个指针在用*取值
数组指针
int buf[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &buf;
for(i = 0; i < 5; i++)
{
printf("p[%d]:%d\n",i, *(*p + i));
//或者 printf("%d\n", (*p)[i]);
}
//输出结果:
p[0]:1
p[1]:2
p[2]:3
p[3]:4
p[4]:5
p是一个指针,指向的是存放a地址的指针
所以(*p)也是也是一个指针,表示数组a的首地址
对 (*p)再取值 ===》 *(*p) 就等价与 buf[0]
注意:这里赋值是int (p)[5]=&buf; 而并非 int (p)[5]=buf;
使用后者会产生警告。
从值面上&a和a的值都是相同的,但二者的意义不同
&a表示a变量的首地址
a表示a首个元素的首地址
待续下面分析函数指针和指针函数的区别