caoxwei2 2015-01-05 11:09 采纳率: 100%
浏览 2018
已采纳

C语言指针问题,求高手解惑

1.假设有一维int a[5],a代表数组的地址,&a有什么意义呢,
为什么这里a和&a的值相等呢?
2.假设有二维数组int a[2][3],a和&a也相等吗?
3.这个是谭浩强C程序设计里的例题:

 #include<stdio.h>
int main()
{
    int a[4]={1,3,5,7};
    int (*p)[4];
    p=&a;    //第六行
    printf("%d\n",(*p)[3]);
    return 0;
}

书中说第六行只能写成p=&a,而不能是批p=a,
书中说p=a 表示p的值是&a[0],指向a[0].
p=&a表示p指向一维数组(行),(*p)[3]是p所指向行中序列为3的元素。
但实际上我用VC6.0调试时两个都能得到7的答案,只不过当p=&a时,没有报警,
而当p=a时,编译器有预警信息: warning C4047: '=' : 'int (*)[4]' differs in levels of indirection from 'int *'

难道谭浩强的这本书是按旧的C标准写的吗?还是说编译器允许这样的写法?
4.a和&a无条件等价吗?

  • 写回答

10条回答 默认 最新

  • threenewbee 2015-01-05 11:22
    关注

    如果你非要较真,那么

    在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。
    看到这里我想应该就知道为什么 会有I 和 III式的结果了。

    对于II 和 IV 则是特殊情况,在《C和指针》p142中说到,在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。
    ** 所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。**

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料