c ++中的数组和指针

Ara*_*ash -2 c++ arrays pointers

我经常听到数组的名称是指向一块内存的常量指针,因此语句就像

int a[10];
Run Code Online (Sandbox Code Playgroud)

int * const p= a;
Run Code Online (Sandbox Code Playgroud)

在某种意义上,p必须是相等的,p是指向与数组a []相同的内存块的指针,并且它也可能不会被更改为指向内存中的另一个位置.

但是,如果您尝试打印这两个指针的大小,则会得到不同的结果:

cout<< sizeof(a); // outputs size of 10 integer elements
Run Code Online (Sandbox Code Playgroud)

cout<< sizeof(p); // outputs sizeof pointer to int
Run Code Online (Sandbox Code Playgroud)

那么,为什么编译器会以不同的方式对待这两者?从编译器的角度来看,数组和指针之间的真正关系是什么?

eer*_*ika 5

我经常听到数组的名称是指向内存块的常量指针

你经常被误导 - 或者你只是误解了.数组不是指向内存块的常量指针.Array是一个包含一系列子对象的对象.所有对象都是一块内存.指针是包含对象地址的对象,即它指向对象.

所以在下面的引用中,a是一个数组,p指向其中的第一个子对象a.

int a[10];
Run Code Online (Sandbox Code Playgroud)

int * const p= a;
Run Code Online (Sandbox Code Playgroud)

在某种意义上,p必须是相等的,p是指向与数组a []相同的内存块的指针,并且它也可能不会被更改为指向内存中的另一个位置.

如果这是你的equ的定义,那么对于非数组对象也是如此:

char c;
int * const p = &c;
Run Code Online (Sandbox Code Playgroud)

这里p"指向与内存相同的c",并且可能不会更改为指向内存中的另一个位置.这是否意味着char对象与指针"相等"?不,而阵列也不是.

但是不是(数组的名称),一个指向数组相同元素的常量指针?

不,数组的名称不是常量指针.就像名字char不是一个常量指针.

数组的名称包含数组中第一个元素的地址,对吧?

让我们更一般,这不是特定于数组.变量的名称"保存变量名称对象的地址".在运行时,地址不会"保留"在内存中.它在编译时被编译器"保留".对变量进行操作时,编译器会确保在正确的地址处对对象执行操作.

数组的地址始终与数组的第一个元素(子对象)的地址相同.因此,名称确实 - 至少在概念上 - 保持相同的地址.

如果我使用*(a+1),这是一样的a[1],对吧?[错字修正]

对.我将详细说明:一种是在指针的情况下编写另一种方式的另一种方式.哦,但a不是指针!这是catch:数组操作数被隐式转换为指向第一个元素的指针.这种隐式转换称为衰减.这是数组类型的特殊功能 - 它的特殊功能可能使得理解指针和数组之间的差异最为困难.

因此,即使数组的名称不是指针,它也可以衰减为指针.只是在某些情况下,名称并不总是衰减为指针.它会在您使用时衰减operator[],并在您使用时衰减operator+.当您将数组传递给接受指向子对象类型的指针的函数时,它会衰减.它在您使用时不会衰减,sizeof并且当您将其传递给通过引用接受数组的函数时它不会衰减.