前言
int (*p)[3] = a[5][3]
关于二维数组的指针定义方法,在第一次接触到上面这种定义的方式的时候很多人可能跟我有一样的疑问:这个表达式到底是怎么个意思?于是我研究了一下总结出了了我自己的一些见解。
解析
int (*p)[3] = a[5][3]
其中首先定义了一个包含有三个元素的指针数组,可以将其中的元素看做三个一维数组,如下图:
而这三个一维数组可以看做 a0[5],a1[5],a2[5] 即:
所以,假设我们吧定义一个指针并把p赋给它
int* ptr = nullptr;
ptr = p;
此时p
应该指向这个包含三个元素的数组的第一个元素,即:
所以
p == &a
所以
*p == a0[0]
*(p+1) == a1[0]
*(p+2) == a2[0]
那么知道了上面的知识,假设我们想访问a1[3]
应该怎么办呢?
如果我们想要访问a1[3]
其实也很简单:
既然
*p == a0[0]
那么
*( *(p + 1) + 3 ) == a1[3]
总结
再回到一开始的定义
int (*p)[3] = a[5][3]
那么如果访问a[4][2]
的话我们就可以
*( *(p + 2) + 4 ) == a[4][2]
整个过程就是这个样子了。
最后,既然是数组,总是有需要遍历这个数组的时候,遍历的时候我们可以使用一个两层的嵌套循环:
int (*p)[3] = a[5][3];
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
cout << *( *(p + i) + j ) << "," ;
cout << endl;
}
写在最后
这个里面的思路都是我自己想出来的,如果哪里有错误的可以在评论区留言,我会进行修改。
最后文章结束,感谢大家的阅读。