(*p)[5]与*P[5]有什么区别,看代码
main()
{
char a[5]={'A','E','C','D'};
//数组指针
char (*p3)[5] = a;
//在栈中产生一个大小为 5个char的空间 p代表的的是整个空间的首地址
printf("p3 is %x\n",p3);
printf("*p3 is %x\n",*p3);
//空间的首地址和数组的首地址相同
printf("**p3 is %c\n",**p3);
//数组的首地址的值
//char (*p)[5]; 表示 p 是 一个 指针,用于 指向 有5个元素的 char 型 数组。
//*p[5] -- 方括号优先,p[5] 是 数组, *p[5] 则是指针数组。表示 p 是 五个 指针。
//char *p[5]; 表示 p 是 指针数组,可以存放 5 个指针。它们5个,各自 可以 指向 各自的 char 目标。
return 0;
}
执行结果
p3 is 65ffb6b
*p3 is 65ffb6b
**p3 is A
为什么这里 p3 *p3是打印出来是一样的?
来看一段代码
int arr[5] = {0};
printf("arr is %x, &arr is %x\n", arr, &arr);
执行结果:
arr is b9bff890, &arr is b9bff890
我现在直接用printf输出arr相当于输出了arr中储存的内容(不是输出以该内容为地址的变量),其结果居然与arr的地址是相同的,这怎么可能?
理解这个很重要,当你理解之后你就会发现设计C语言的大师们是多么的聪明,这些设计非常利于C语言书写的简洁
a与&a都是指针,指针有两个要素
第一个是地址值,也就指向的位置,你打印出来的就是地址值,a与&a的地址值是一样的
第二个是类型(所指向的数据类型),a指向数组第一个元素,&a指向数组a,a+1后的地址值会偏移一个元素的长度,&a+1后的地址值会便宜一整个数组的长度,所以a与&a类型是不一样的
关于指针与数组的关系,理解之后对代码质量会有很大的帮助,有一句话说的好:在C语言中只有一维数组(N维数组的元素是数组),数组名作为指针时永远指向第一个元素,如
数组a[3] ,*a = a[0],
数组a[3][4], *a = a[0],只不过这时候a[0]又是一个数组,这时候a[0]又是指向它自己元素的第一个元素,又有*a[0] = a[0][0].
这种方式可以推广到N维数组,所有数组直接对数组名取地址(如&a)得到的指针指向该数组,而不是指向第一个元素