关于c ++:指针和多维数组


pointers and multi-dimensional arrays

本问题已经有最佳答案,请猛点这里访问。

0

我知道这是一个非常基本的问题,但是没有多少谷歌能帮我解决这个问题。这就是为什么要把它贴在这里。在C++中考虑EDCOX1的声明0

这是一个一维数组,x是基指针,它包含数组第一个元素的地址。所以x给了我那个地址,*x给了第一个元素。

同样适用于声明

1
 int x[10][20];

什么样的变量是x。当我这样做的时候

1
 int **z = x;

编译器说它不能把int (*)[20]转换成int **,为什么cout<cout<<*x;的值相同??如果我声明一个指针数组为

2

那么(在类型上)xp之间有区别吗?因为当一个声明int x[10]int *p时,将x分配给p是有效的,但对于二维数组则不是这样?为什么?有人能帮我清理一下这个吗,或者提供一个好的资源材料。


多维数组只是简单的句法糖。在幕后,这只是一个10*20int长的一维数组。在x[5][6]访问元素时,编译器生成相当于x[5 * 20 + 6]的元素;


数组和指针不是一回事。在C和C++中,多维数组只是"数组的数组",没有涉及指针。

1
int x[10][20];

是10个数组,每个数组包含20个元素。如果在一个环境中使用x,它将衰减为指向其第一个元素的指针,那么最后会得到指向这20个元素数组之一的指针,即您的int (*)[20]。注意这样的东西不是指针对指针,所以转换是不可能的。

1
int *p[10];

是一个由10个指针组成的数组,所以它不同于X。

特别是,您可能会遇到问题,因为您似乎认为数组和指针是相同的-您的问题是:

0

这不是真的。一维x是一个数组,只是在某些情况下数组会衰减为指向第一个元素的指针。

阅读常见问题解答,了解有关此主题的所有信息。


以下是它的工作原理,请参阅代码和注释:

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

这都是因为当涉及数组和指针时,a[b]相当于*(a+b)