C/C++数组名和指针的关系

数组名不是指针!!!

  • 数组名指代的是数组整个实体结构。
  • 数组名可以外延成指代实体的指针,而且是一个指针常量。
  • 指向数组的指针,仅仅是数组第一个元素的地址。
  • a[i]内部翻译为*(a+i)
  • 对数组名取地址,&array+1,其步长是整个数组,与&(array+1),步长是一个数组元素不同

数组名退化为指针

在形参为数组的情况下,数组名会退化为指针,在函数内部,实际上是一个指针。

1
2
3
4
void foo(int array[])
{
cout << sizeof(array) << endl; //输出为8,为一指针大小,不是数组的大小
}

sizeof是个操作符,不是函数

sizeof操作符:求得是对象或类型的大小,这里的“大小”指的是“所占内存空间的实际大小”。

数组名代表的是整个数组结构实体,所以求得的是整个数组实体的内存大小。

指针结构实体本身,表示“一个指针结构”占用的内存大小,64位系统为8字节。

1
2
3
4
5
int array[10]; 
sizeof(array); // 4 * 10 = 40字节

int * p;
sizeof(p); // 8字节