假设我在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
我只是不明白这里发生了什么。
a
是第一个元素的地址,对吧?在一维数组中,*a
应该是第一个元素的值,而是与a
相同?! *a
在这种情况下甚至意味着什么?
为什么a + 1
与*a + 1
不同?
答案 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
。因此*a
与a
的地址相同a[0][0]
具有相同的价值。
在这种情况下,*甚至意味着什么?
之前已回答,*a
是第一个数组第一个元素a[0][0]
的地址,*(a+1)
是第二个数组第一个元素a[1][0]
的地址。
并分析您的第二个问题
为什么
a + 1
与*a + 1
不同?
此时也许你可以回答你自己的问题。
a
是a[0]
然后
的地址
a+1
是a[1]
的地址,其地址为a[1][0]
。
您可以按
cout<<**(a+1)<<endl; // 9
其他方式*a
是a[0]
的值,a[0][0]
的地址。
因此*a+1
是a[0][1]
的地址。您可以将值打印为
cout<<*(*a+1)<<endl; // 6