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)
那么,为什么编译器会以不同的方式对待这两者?从编译器的角度来看,数组和指针之间的真正关系是什么?
我经常听到数组的名称是指向内存块的常量指针
你经常被误导 - 或者你只是误解了.数组不是指向内存块的常量指针.Array是一个包含一系列子对象的对象.所有对象都是一块内存.指针是包含对象地址的对象,即它指向对象.
所以在下面的引用中,a是一个数组,p指向其中的第一个子对象a.
Run Code Online (Sandbox Code Playgroud)int a[10];和
Run Code Online (Sandbox Code Playgroud)int * const p= a;在某种意义上,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并且当您将其传递给通过引用接受数组的函数时它不会衰减.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |