C ++中的多维数组和指针

时间:2015-10-04 19:45:03

标签: c++ arrays pointers multidimensional-array

假设我在C ++中声明并初始化以下多维数组:

unsigned a[3][4] = {
    {12, 6, 3, 2},
    {9, 13, 7, 0},
    {7, 4, 8, 5}
};

之后我执行此代码:

cout << a << endl; // output: 0x7fff5afc5bc0
cout << a + 1 << endl; // output: 0x7fff5f0afbd0
cout << *a << endl; // output: 0x7fff5afc5bc0
cout << *a + 1 << endl; // output: 0x7fff5f0afbc4

我只是不明白这里发生了什么。

  1. a是第一个元素的地址,对吧?在一维数组中,*a应该是第一个元素的值,而是与a相同?! *a在这种情况下甚至意味着什么?

  2. 为什么a + 1*a + 1不同?

2 个答案:

答案 0 :(得分:3)

你应该尝试找一些关于指针,数组和数组到指针衰减的好文档。在您的情况下,unsigned a[3][4]是类型为unsigned [3][4]的二维数组。每当您将其称为a时,它会衰减到指向unsigned[4]的指针,因此a的衰减类型为unsigned (*)[4]。因此,取消引用它会为您提供一个数组,因此*a是数组[12, 6, 3, 2](从技术上讲,它是指向数组中第一个元素的指针)。

现在,a+1表示&#34;将指针增加到unsigned[4] 1&#34;,在你的情况下,#34;跳跃&#34;内存中有4个未签名的,所以现在a+1指向&#34;行&#34;在您的示例中以1为索引。取消引用它*(a+1)会产生数组本身([9,13,7,0])(即指向它的第一个元素的指针),再次取消引用会为您提供第一个元素,即**(a+1)等于{{1} }。

另一方面,9首先取消引用*a+1,因此您获得第一行,即a(再次,技术上指向此行的第一个元素的指针)。然后将其递增1,最后指向元素[12,6,3,2]。再次取消引用6,会产生*(*a+1)

6等效地定义为

可能会有所帮助
a

答案 1 :(得分:2)

二维数组是数组的数组。 您可以将a显示为

a = { a[0], a[1], a[2]} 

a[0]a[1]a[2]

a[0] = { a[0][0], a[0][1], a[0][2], a[0][3]};
a[1] = { a[1][0], a[1][1], a[1][2], a[1][3]};
a[1] = { a[2][0], a[2][1], a[2][2], a[2][3]};

分析您的第一个问题

  

a是第一个元素的地址,对吧?

a是第一个元素的地址,a的第一个元素是a[0],它是a[0][0]的第一个元素的地址。

  

* a应该是第一个元素的值,而是它与a?

相同

*a应该是引用a[0]的第一个元素的值。我们看到a[0]a[0][0]的地址,a。因此*aa的地址相同a[0][0]具有相同的价值。

  

在这种情况下,*甚至意味着什么?

之前已回答,*a是第一个数组第一个元素a[0][0]的地址,*(a+1)是第二个数组第一个元素a[1][0]的地址。

并分析您的第二个问题

  

为什么a + 1*a + 1不同?

此时也许你可以回答你自己的问题。

aa[0]然后
的地址 a+1a[1]的地址,其地址为a[1][0]。 您可以按

打印值
cout<<**(a+1)<<endl; // 9

其他方式*aa[0]的值,a[0][0]的地址。 因此*a+1a[0][1]的地址。您可以将值打印为

cout<<*(*a+1)<<endl; // 6