D.K*_*ngh 5 c++ arrays multidimensional-array
我在理解多维数组时遇到了很多问题.让一个数组
x[2]; // now x is constant pointer to first element i.e x's name is address of x[0]
Run Code Online (Sandbox Code Playgroud)
现在二维数组:
x[2][5]; // here x is address of x[0] which contains the address of first element of array x[][0];
Run Code Online (Sandbox Code Playgroud)
现在是指针
int(*y)[5];
Run Code Online (Sandbox Code Playgroud)
是指向整数数组5的指针.怎么写y = x?
现在我在VS中做了一些实用的理解,这是在这里,我的主要问题在于图像:
http://img184.imagevenue.com/img.php?image=96382_first_122_1120lo.jpg
请从概念上回答问题; C++如何存储多维数组等
我会非常感谢任何帮助:)
正如其他人所指出的,多维数组是一个数组数组,而不是一个指针数组.
我认为误解的主要原因是任何数组实际上都是指针的概念.但事实并非如此.数组是一个变量,它包含相同类型的固定大小的连续元素集合.因此,当您声明一个数组时,就像int x[2]声明一个包含两个整数的变量一样.请注意,它不包含任何指针.
现在这个常见误解的根源在于,在C/C++中,数组名称的计算结果是第一个元素的地址,因此可以用作指针.换句话说,当你写作时x,你隐含地意味着&x或&x[0].这可能是为了使表达式更具可读性.
多维数组只是一个数组数组.换句话说,同样的逻辑适用于它们,没有什么特别之处.你从名称开始读取C/C++声明,然后在你遇到它们时应用修饰符,首先是[]和(),然后是*,然后输入,这样你就可以解释像这样的多维数组(显式指定的读取顺序) ):
int x [ 2] [ 5];
6. "of type int" 1. "x" 2. "is an array" 3. "of 2". 4. "arrays" 5. "of 5 elements"
Run Code Online (Sandbox Code Playgroud)
因此,在C/C++中没有多维数组这样的东西,但是存在一维数组的一维数组.根据一维数组的规则x,&x和&x[0]所有计算到第一个元素的地址.但由于第一个元素是一个数组,因此x[0]计算该数组的地址,即第一个元素的地址,即int.这同样适用于&x[0]和&x[0][0].这就是为什么它的值x[0]与它的地址相同 - 因为它x[0]是一个数组.
请注意,虽然这些内容评估为相同的地址,但它们具有不同的类型.x是一个指向5个int的数组的指针,以及&x[0]它们都计算为x的第一个元素的地址.x[0]求值为第一个元素的地址x[0],因此它是指向int的指针,同样适用于&x[0][0].这个例子编译得很好,并为所有4个指针打印相同的地址:
int x[2][5];
int (*y1)[5] = x;
int *y2 = x[0];
int (*y3)[5] = &x[0];
int *y4 = &x[0][0];
printf("%p %p %p %p\n", y1, y2, y3, y4);
Run Code Online (Sandbox Code Playgroud)
现在,在不同语言中使用的阵列有不同的内存布局.例如,对于二维数组,您可以按行或按列对元素进行分组.在C/C++中,由于没有"真正的"多维数组,因此内存布局由上述规则隐式定义.因为int x[2][5],可以被认为是一个有2行5列的二维数组,实际上是2个数组的数组,每个数组代表一行,你得到的是"按行分组"的布局,这是在shybovycha的回答.
请注意,还可以创建指针数组并将其用作多维数组.与"通常"多维数组的差异是:
这种方法的优点是你可以使用这个数组作为指针指针(例如int **y),这使得这种类型的所有多维数组彼此兼容,即使它们具有不同的大小.但在这种情况下,尺寸必须单独存储.
看:任何多维数组都是数组数组.例如,x[2][5]将等于此表:
x[0][0] x[0][1] x[0][2] x[0][3] x[0][4]
x[1][0] x[1][1] x[1][2] x[1][3] x[1][4]
指针赋值完全相同:x[0]是2x5表中的第一行,所以int *y = x[0]或int *y = x[1]将第一行的地址复制到y.
但是,如果你这样做,int (*y) = x它会将地址存储x[0][0]到y变量中(int y创建int实例,同时int (*y)为您提供此实例的地址).
UPD:让我们int **x变量.它的大小无关紧要.只需将此作为一个事实x,x[0]并x[0][0]为您提供相同的地址.这可以解释Pointer name means its address. Multi-dimensional array is a pointer to pointer. Its name means address of pointer it's pointing on which means address of the last pointer' first element.为(对于同谋).