我正在学习2D数组和它的指针表示。我运行以下代码来获得2d数组的内部工作。对于arr2d[0]
,我得到了奇怪的结果int arr2d[2][3]{{1,2,3},{4,5,6}};
cout<<"&arr2d[0][0] :"<<&arr2d[0][0]<<endl;
cout<<"(&(arr2d[0])) :"<<(&(arr2d[0]))<<" arr2d[0] :"<<arr2d[0]<<endl;
cout<<"*(arr2d[0]) :"<< *(arr2d[0])<<" *(&(arr2d[0])) :"<<*(&(arr2d[0]))<<endl;
输出:
&arr2d[0][0] :0x3e6d7ff6c0
(&(arr2d[0])) :0x44efbffbe0 arr2d[0] :0x44efbffbe0
*(arr2d[0]) :1 *(&(arr2d[0])) :0x44efbffbe0
如何*(arr2d[0])有1作为输出,如果arr2d[0]是"循环指向";本身?很明显,指针算法对arr[0]不起作用,因为arr[0]+1不会得到一个到arr[1]。
我不希望arr[0]循环指向自己,我希望它指向一个长度为3的1D数组的指针。这告诉我们这发生了,但我想知道为什么arr[0]指向自身同时*(arr[0])给出1?
如果
arr2d[0]
是"循环指向",*(arr2d[0])
怎么可能有1作为输出?本身?
它没有指向自身。数组不是指针,但像任何变量一样,它们有一个地址,数组的地址与第一个元素的地址相同。这扩展到多维数组,因此arr2d
,arr2d[0]
和arr2d[0][0]
都有相同的地址,尽管它们的类型不同。
显然指针算法对
arr[0]
不起作用,因为arr[0]+1
没有得到一个到arr[1]
。
arr2d[0]
衰减为&arr2d[0][0]
,则aarr2drr[0]+1
为&arr2d[0][0]+1
,与arr2d[0][1]
相同。如果您使用了表达式arr2d + 1
,那么它将与&arr2d[0] + 1
相同,从而得到arr2d[1]