You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中&arr与arr的指针疑问及代码合法性咨询

数组arr与&arr的疑问解答

先看对应的代码:

#include <stdio.h>
int main()
{
    int *a, *b,*c,**d;
    int arr[10]={0};
    a=arr;
    b=&arr;//is this true?why?
    c=&arr[0];
    d=&a;
    printf("%p,%p,%p,%p",a,b,c,d);
    return 0;
}

1. &arr是否指向数组的首地址?

是的,&arr的数值和数组首元素的地址(arr、&arr[0]的数值)完全一致,都指向数组在内存中的起始位置。但要注意,它的类型不是int*,而是int (*)[10]——也就是指向包含10个int元素的数组的指针。

2. 语句b=&arr;是否合法?

不合法。b的类型是int*(指向单个int的指针),而&arr的类型是int (*)[10](指向长度为10的int数组的指针),两者类型不兼容,C语言不允许直接赋值,编译时会抛出类型不匹配的警告或错误。如果非要让赋值合法,得加强制类型转换:b = (int*)&arr;,但这种写法不推荐,容易混淆逻辑。

3. arr与&arr之间的区别

  • 类型差异:
    • arr在绝大多数表达式里会被自动转换成指向数组首元素的指针,类型为int*。
    • &arr是取整个数组的地址,类型为int (*)[10](指向10个int元素组成的数组的指针)。
  • 指针运算行为不同:
    • 对arr执行+1,指针会移动一个int的字节数(通常是4字节),指向数组的下一个元素arr[1]。
    • 对&arr执行+1,指针会移动整个数组的字节数(10*4=40字节),直接跳到当前数组之后的内存位置。
  • 语义不同:
    • arr代表的是数组首元素的地址,聚焦于单个元素。
    • &arr代表的是整个数组的地址,聚焦于整个数组作为一个连续内存块的整体。

内容的提问来源于stack exchange,提问作者zhm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:45:48