数组声明
/*类型 数组名称[数组元素个数];*/
/*4个元素的整数数组*/
int InteArray[4];
/*2个元素的结构数组,结构内含有4个整型的数组*/
struct
{
int InteArray[4];
}StructArray[2];
在上述代码中,我们声明了两个数组,一个整数数组(InteArray
),一个结构数组(StructArray
)。
数组地址
在上述的声明中 InteArray
和 StructArray
的名称数据都是数组的地址。
下面主要根据 InteArray
进行分析。
地址
C语言数组的本质是指针。
因此我们可以将 InteArray
视作是指向数组地址的指针,或者指向数组下标为 0
元素的地址的指针。
而 &InteArray
又是什么呢?是指向数组地址的指针的指针吗?接下来我们对其进行测试:
#include<stdio.h>
int main(void)
{
int InteArray[4] = { 0 };
printf("InteArray: %p\n", InteArray);
printf("&InteArray:%p\n", &InteArray);
return 0;
}
结果令人不解,InteArray
和 &InteArray
指向的居然是同一个地址,而不是所谓的 “ 指向数组地址的指针的指针 ”。
我们在看一下另一个代码示例:
int InteArray[4] = { 0 };
int* IntePo = &InteArray;
其实,第二行的代码在 ANSI C 中非法的,在 ANSI C 中并没有 &InteArray
这个 “ 数组的指针 ” 这一概念,所以 &InteArray
要么被视为非法,要么就等于 InteArray
。引用《C陷阱与缺陷》。
显然,我们的编译器选择了后者。
所以,InteArray
和 &InteArray
在地址表达上并无区别。
sizeof
在地址上没有区别,但是并不代表二者的含义相同。
请看下面的 sizeof
运算结果:
从 sizeof
对 InteArray
进行的计算能看出,InteArray
所指向的地址表明的是整个数组的长度。
而 &InteArray
单纯的是数组的地址的长度。