指向二维数组中整行的指针

时间:2014-07-04 17:12:31

标签: c arrays pointers

假设我将二维数组声明为:

int a[10][10];

根据我的理解,a是int类型的双指针。

假设我声明了一个指向整行的指针,如下所示。

int (*p)[10];

同样a[0]指向第0行,a[1]指向第1行......依此类推。

所以我尝试将p初始化为

p = a[0];  /* so that p can point to row 0 */

我收到编译器警告指示不兼容的指针。 但如果我写

p = a;

这很好用。

有人可以告诉我这里的错误吗?

4 个答案:

答案 0 :(得分:4)

  

根据我的理解,a是int类型的双指针。

你错了。 aint数组的类型数组。数组名称转换为指向其第一个元素的指针,除非它是sizeof和一元&的操作数。

  

同样a[0]指向行0a[1]指向行1 ..依此类推。

没有。 a[0]指向行0的第一个元素,a[1]指向衰减后行1的第一个元素。 &a[0]会为您提供行0

的地址
p = &a[0];  // Equivalent to p = a 

答案 1 :(得分:1)

a不是双指针。它是由10个整数组成的十个数组的数组。在大多数用途中,它会'衰变'#34;到类型为int (*)[10]的指针,即指向第一行的指针。

因此,在p = a作业中,a如上所述衰减,因此p指向第一行。

如果您想指向另一行,则需要明确地使用它的地址:

p = &a[5]

答案 2 :(得分:1)

  

a是int类型的双指针。

没有。 a是一个int数组数组。

  

此外,[0]指向第0行

没有。 a[0] 的第一行,是一个int数组。要指向到第一行,您需要执行&a[0]

大多数情况下,您可以将&a[0]写为a,因为大多数(但不是全部)上下文中的数组表达式被隐式转换为指向其第一个元素的指针。 / p>

答案 3 :(得分:0)

您只需使用其名称,就可以始终指定指向数组,字符串或函数的指针。即,如果 a [10] 是10个整数元素的数组,则可以使用表达式 p = a 指定指针p,现在&#39; a& #39; 将给出数组的基址。因此,&#39; <&#39; 现在指向一个包含10个元素的数组。

相同的概念可以应用于字符串和函数..