多维数组内存存储概述

时间:2016-04-06 16:40:17

标签: c++ pointers multidimensional-array

最近我开始学习c ++中的指针和参考(不仅仅是通常使用它们,而是各种各样的方式,我不想在不久的将来遇到它们的问题)。

从我的角度来看,1d静态分配数组类似于int * const指针。我的问题是,当我使用指针动态分配时,指针本身具有除第一个元素之外的其他内存地址,这在1d数组中不是这种情况。这是一个例子

http://REMOTE_SERVER_IP_ADDRESS:7474

输出结果为:

int a[5];
cout<<&a<<" "<<&a[0]<<"\n";
int* t=new int[10];
cout<<&t<<" "<<&t[0]<<"\n";

我无法想象如何存储1d数组,在1个4字节的块中,您可以存储值或地址。 我也尝试过2d阵列,还有更多的交叉点。

0x6afed0 0x6afed0
0x6afecc 0xcb0e40

输出:

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";

如果有人会启发并解释如何存储这些数组,我将非常感激。

编辑:更具体地说,我知道并且逻辑如何存储由指针动态创建的关键字。但是如果a应该存储[0]的地址,那么&amp; a和&amp; a [0]如何具有相同的值。那个存储块(&amp; a)存储了什么呢?a [0]的值或者a [0]的地址。希望我清楚我的问题是什么。

4 个答案:

答案 0 :(得分:1)

t是在堆栈上声明的指针,它保存堆上数组的地址。 &t获取t的地址,AKA是堆栈上t的位置。如果要访问阵列的第一个成员,可以*tt[0]。当您使用括号表示法时,C ++会自动解除引用并根据t的类型执行指针运算。

但是,&t[0]基本上会为您提供t[0]的地址,这就是为什么它与&t不同,因为&t位于堆栈上&t[0]生活在堆上。因此,如果您想要t[0]的地址,您可以使用该表示法,否则如果您只想要这些值,请坚持t[0]

答案 1 :(得分:1)

数组是一个对象,它包含N个对象的连续块,其中N是一些常量大小。数组的地址是数组的开头,因此第一个对象的地址和数组的地址是相同的。

指向数组的指针是唯一的对象。由于它是它自己的对象,它有自己的地址与它所拥有的地址分开。因此,int* t=new int[10]; &tt的地址,其中&t[0]是由new分配的数组的第一个元素的地址。

答案 2 :(得分:1)

数组是该语言的第一类实体,因此当您声明一个数组变量

int a[10];

编译器知道数组的尺寸。分配动态存储空间时

int* p = new int[10];

只有你和分配者知道这个空间有多大。

在阵列版本中,a 数组。它有一个地址,但编译期间编译器会保存该地址。在分配标准中,p数据的地址,直到运行时才会知道。

导致人们困惑的原因是,两者似乎可以互换:你可以用两者做指针和数组运算,使用指针所在的位置:

void f(int*);

int a1 = a[1];
f(a);
int p1 = p[1];
f(p);

这是设计的,它的名字叫array-pointer-equivalence,强调我的:

  

C中关于数组和指针的大部分混淆可以追溯到对这个语句的误解。说数组和指针是等同的&#39;&#39;意味着它们既不相同也不可互换。这意味着定义了数组和指针算法,以便可以方便地使用指针来访问数组或模拟数组。换句话说,正如Wayne Throop所说,它的&#39;&#39;指针算法和数组索引在C中是等价的,指针和数组是不同的。&#39; &#39;

     

具体而言,等价的基石是这个关键定义:

     
    

对表达式中出现的array-of-T类型的对象的引用将表达式(有三个例外)衰减为指向其第一个元素的指针;结果指针的类型是指向T的指针。

  

答案 3 :(得分:0)

&t获取指针t的地址,而不是第一个元素的地址。第一个元素的地址只是t(因为tint*,它指向内存块。