指针是怎么指的,求解析

#include<iostream.h>
void main()
{int n[][3]={10,20,30,40,50,60};
int (p)[3];
p=n;
cout<<p[0][0]<<","<<
(p[1]+1)<<","<<(*p)[2]<<end1;

10,50,30

1、p[0][0]好理解,相当于n[0][0]
2、(p[1] + 1):第二行第二个元素
3、( * p)[2],首先p是一个二级指针,p[0]指向n的第一行,p[1]指向n的第二行;然后
p得到的是n的第一行的首地址,一个地址相当于一个一级指针,和[2]结合,就相当于n[0][2]了

一维数组:
a <=> &a[0] a+1 <=> &a[1]
*a <=> a[0] *(a+1) <=> a[1]
二维数组:
a[0] <=>&a[0][0] a[1] <=> &a[1][0] a[1]+1 <=> &a[1][1]
*a[0] <=>a[0][0] *a[1] <=> a[1][0] *(a[1]+1 ) <=> a[1][1]

int n[][3]={10,20,30,40,50,60}; 相当于 int n[2][3],即2行3列
p就是个行指针,同时也相当于一个二维数组,你可以这么来理解
------p[0][0]就是二维数组的第0行第0列的值
----- * (p[1]+1) ,p[1]相当于第1行的开头位置,+1相当于第1行第1列,然后 * 号取得第1行第1列的值
---- ( * p)[2],p作为二维数组的开头,同时也是第0行的开头,因此( * p)相当于p[0],指向第0行,[2]则表示取得第0行第2列的值
最终输出为:10,50,30


int n[][3]={},n23列的二维数组
int (*p)[3];
p = n;
*p是int*指针,指向了包含3int元素的数组,
p[0]指向n[0]这一行;p[1]指向n[1]这一行,也就是说:
p[0]和p[1]是int*指针,所以p[1]+1是指向了n数组第二行第二列的元素

内存图如下所示:

img

代码及运行结果:

#include <iostream>
using namespace std;
void main()
{
    int n[][3] = { 10,20,30,40,50,60 };
    int(*p)[3];
    p = n;
    cout << p[0][0] << "," << *(p[1] + 1) << "," << (*p)[2] << endl;
}

运行结果(输出的第二个不知道你要输出的是(p[1] + 1) 还是 *(p[1] + 1) ,代码中有些星号被吃掉了),如果输出的是*(p[1] + 1),输出的是内存中的值,结果如下:

img

如果输出的是(p[1] + 1) ,输出的是地址,结果如下:

img

如有帮助,望采纳,谢谢。

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632