在C语言中,数组名通常代表数组首元素的地址,但有以下两种情况例外:
1. 当使用`&`运算符获取数组名的地址时,得到的是整个数组的地址,而不是数组首元素的地址。例如:
int arr[10];
// &arr 是整个数组的地址,不同于arr(数组首元素的地址)
printf("%p\n", &arr);
2. 使用`sizeof`运算符来计算数组所占空间大小时,数组名代表的是整个数组的大小(以字节为单位),而不是地址:
sizeof(arr); // 这将返回整个数组arr所占用的总内存大小,而不是地址
在这两种情况下,数组名并不表示数组首元素的地址。在其他所有表达式中,数组名可以被看作是数组首元素的指针常量。
3.当对数组名取地址(例如 int arr[10];
中的 &arr
)后再进行加一操作时,结果增加的并非一个元素的大小,而是整个数组类型的大小。由于数组是一段连续内存空间,因此对于 int arr[10];
,(&arr) + 1
将使地址增加整个数组占用的内存大小,即10个 int
类型变量所占的总字节数(通常为40字节)。
所以,&arr+1
和普通整型变量地址加一在行为上确实是有显著区别的。