pointers and multi-dimensional arrays
0
我知道这是一个非常基本的问题,但是没有多少谷歌能帮我解决这个问题。这就是为什么要把它贴在这里。在C++中考虑EDCOX1的声明0
这是一个一维数组,x是基指针,它包含数组第一个元素的地址。所以
同样适用于声明
1 | int x[10][20]; |
什么样的变量是
1 | int **z = x; |
编译器说它不能把
那么(在类型上)
多维数组只是简单的句法糖。在幕后,这只是一个10*20
数组和指针不是一回事。在C和C++中,多维数组只是"数组的数组",没有涉及指针。
1 | int x[10][20]; |
是10个数组,每个数组包含20个元素。如果在一个环境中使用
1 | int *p[10]; |
是一个由10个指针组成的数组,所以它不同于X。
特别是,您可能会遇到问题,因为您似乎认为数组和指针是相同的-您的问题是:
0这不是真的。一维
阅读常见问题解答,了解有关此主题的所有信息。
以下是它的工作原理,请参阅代码和注释:
2样品输出:
&x=0040805c x=0040805c &x[0]=0040805c x[0]=0040805c *x=0040805c &x[0][0]=0040805c
所有的结果指针都是相同的值,因为我显式或隐式使用了0的索引,而且数组是连续的,而且它们的第一个(iow,0th)元素总是在数组中的最低地址。所以,即使有3种不同的指针类型,它们都有效地指向x[0][0],元素等于1。
数组对指针的衰减是C和C++的一个非常重要的特性,虽然很难立即掌握。
它允许我们在向数组传递指针时编写更紧凑的代码,我们只需编写数组的名称,而不必使用其第一个元素的地址:
1 2 3 4 | char str1[] = { 's', 't', 'r', '1', '\0' }; char str2[] ="str2"; printf("%s %s %s %s ", &str1[0], str1, &str2[0], str2); |
输出:
str1 str1 str2 str2
它也让我们做一些疯狂的事情:
1 2 3 | int y[3] = { 10, 20, 30 }; printf("%d %d %d %d ", y[2], *(y+2), *(2+y), 2[y]); |
输出:
30 30 30 30
这都是因为当涉及数组和指针时,