当前位置: 首页 > 工具软件 > p > 使用案例 >

c语言中(*p)[5]与*P[5]的区别

暨承平
2023-12-01

(*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)得到的指针指向该数组,而不是指向第一个元素

 类似资料: