最近,我开始学习c ++中的指针和引用(不仅是它们的通常用法,而且还有各种方式,我不想在不久的将来出现问题)。
从我的角度来看,一维静态分配数组类似于int * const指针。我的问题是,当我使用指针动态分配时,指针本身具有除第一个元素以外的其他内存地址,而在一维数组中则不是这种情况。这是一个例子
int a[5];
cout<<&a<<" "<<&a[0]<<"\n";
int* t=new int[10];
cout<<&t<<" "<<&t[0]<<"\n";
输出为:
0x6afed0 0x6afed0
0x6afecc 0xcb0e40
我不认为1d数组是如何存储的,在1个4字节的块中,您可以存储值或地址。
我也尝试使用2d数组,并且有更多的交集。
q = new int*[10];
for (i=0;i<10;i++)
q[i] = new int[i+1];
cout<<&q<<" "<<&q[0]<<" "<<&q[0][0]<<"\n";
int b[10][10];
cout<<&b<<" "<<&b[0]<<" "<<&b[0][0]<<"\n";
输出:
0x6afee4 0xe40e40 0xe41240
0x6afd54 0x6afd54 0x6afd54
如果有人能启发我并解释这些数组的存储方式,我将非常感激。
编辑:更具体地说,我知道并且逻辑上如何存储由指针使用new关键字动态创建的数组。但是,如果a应该存储a [0]的地址,那么&a和&a [0]的值如何相同。那块内存(&a)存储的是a [0]的值或a [0]的地址。 ]。希望我清楚我的问题是什么。
最佳答案
数组是一个对象,其中包含N个对象的连续块,其中N为某个恒定大小。数组的地址是数组的开始,因此第一个对象的地址和数组的地址是同一对象。
指向数组的指针是唯一的对象。由于它是自己的对象,因此它具有自己的地址,与它所拥有的地址不同。因此,对于int* t=new int[10];
,&t
是t
的地址,其中&t[0]
是new分配的数组的第一个元素的地址。
关于c++ - 多维阵列内存存储概述,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36457248/