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

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

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值