一 前言
昨天做了CVTE的嵌入式笔试卷子,发现,二维数组的题目好多。头皮微酥。今天总结下这个二维数组到底是个啥。
写少点。
二 结论
二维数组,从本质上去看,就是:
- 一个二维数组,它的每一个数组元素都是一个一维数组,
- 一维数组的一维数组
实际上,去理解:二级指针
二维数组,实际上就是二级指针的应用啊。
用二级指针的思想去考虑二维数组的访问,基本没错了,一切都讲的通了。
三 正文
3.1 二维数组定义
int a[3][6];
实线方框表示第一维的3个元素,虚线用于划分第二维的6个元素。下标值为:
多维数组的元素存储顺序按照最右边的下标率(shuai)先变化的原则,称为行主序(row major order)
3.2 代码
int a[3][4] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} };
int a[0]; // 这是一个地址,是a[0][0]的地址,编译器看就是*(a + 0),
// 从二级指针的角度考虑,*a里装着一个数组元素指针,**a里面装的才是数组的元素a[0][0]
&a; // 得到的是一个地址,数组名也就是a[0][0]的地址
&a[1]; // 得到的是一个地址,a[1][0]的地址
a[0][0]; // 得到一个数,a[0][0]中的装的数
#include <iostream>
using namespace std;
int main()
{
int a[][4] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} };
cout << a[0] << endl; // 地址
cout << "&a[0][0]: " << &a[0][0] << endl;
cout << "&a[0][1]: " << &a[0][1] << endl;
cout << "&a[0][2]: " << &a[0][2] << endl;
cout << "&a[0][3]: " << &a[0][3] << endl;
cout << a[1] << endl;
cout << a[2] << endl;
cout << endl;
cout << *(a + 1) << endl; // a[1]
cout << *(a + 1) + 1 << endl; // a[1] + 4,*(a+1) + 1, 加的不是1,而是sizeof(int) * 1,即a[1][1]的地址
cout << *( *(a+1) + 1 ) << endl; // a[1][1], 结合着*间址访问符看
cout << *( *a + 1 ) << endl; // a[0][1]
cout << endl;
return 0;
}
输出结果为:
参考资料
[1] acodewarrior. 二维数组的两种访问方式. 博客园. 2015.
https://www.cnblogs.com/wgang171412/p/4975596.html
[2] 《C和指针》