数组名、数组地址、数组首字节地址之间的关系

定义一个数组

int a[5] = {0};
  • 此处a的类型看似为整个数组,实际上该数组名a为一个常量指针,也就是数组第一个元素a[0]的地址,同理a+1为第二个元素a[1]的地址。在上例中,数组名的类型就是指向int类型的常量指针,该值不可修改。
  • BUT! BUT! BUT!在数组名作为sizeof操作符或者单目操作符&的操作数时数组名a不作为常量指针,对数组名&a实际得到的是数组的首地址,其值在数值上与a&a[0]相同,但含义不同,&a+1实际已经增加了整个数组的长度。
    地址关系
#include<stdio.h>
int main(int argc, char <
在C语言中,数组名、首元素和首地址之间存在着紧密的联系,以下详细阐述它们之间关系: ### 数组名与首地址 数组名在大多数情况下会被转换为指向数组首元素的指针,也就是说数组名代表了数组的首地址。例如对于数组 `int arr[10];`,`arr` 就表示这个数组的首地址数组地址是整个数组的内存开始的位置,它的类型是一个指向数组类型的指针。不过,数组名和指针还是有区别的,数组名是一个常量指针,不能被重新赋值,而普通指针可以被重新赋值指向其他内存位置 [^2]。 ### 首元素与首地址 首元素即数组中的第一个元素,首元素地址数组中第一个元素所在的内存位置,它的类型是指向单个数组元素的指针。对于数组 `int arr[10];`,`&arr[0]` 就是首元素的地址数组地址和首元素地址在数值上是相同的,都指向数组存储区域的起始位置,但它们的类型不同。在大多数情况下,数组名和首元素地址是相等的,即 `arr` 和 `&arr[0]` 这两个表达式是相等的 [^2]。 ### 数组名地址与首地址 数组名地址 `&arr` 得到的是整个数组地址,虽然它在数值上和数组地址、首元素地址相同,但类型不同。`&arr` 是一个指向整个数组的指针,当对其进行指针运算时,移动的单位是整个数组的大小;而数组名 `arr` 和首元素地址 `&arr[0]` 移动的单位是单个元素的大小。例如,在代码中: ```c #include <stdio.h> int main() { int a[3] = { 1, 2, 3 }; printf("a = %p\n", a); printf("&a[0] = %p\n", &a[0]); printf("&a = %p\n", &a); printf("a+1 = %p\n", a+1); printf("&a[0]+1 = %p\n", &a[0]+1); printf("&a+1 = %p\n", &a+1); return 0; } ``` 在这个代码中,`a`、`&a[0]` 和 `&a` 的值是相同的,但 `a + 1`、`&a[0] + 1` 移动的是一个元素的大小,而 `&a + 1` 移动的是整个数组的大小 [^1]。 ### 对数组名地址再解引用 对于表达式 `*&arr`,根据操作符的先后性,先进行 `&` 运算,再进行 `*` 运算,先取出整个数组地址,然后再解引用。有两种理解方式:第一种是 `*&arr` 得到的是整个数组的所有元素,然后计算整个数组所有元素所占的总字数;第二种是 `*` 和 `&` 抵消,只剩下 `arr` 这个数组名,此时 `arr` 又代表整个数组地址,计算的还是整个数组所占的字数 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值