二维数组、指针详解
二维数组、指针详解:
1.研究二维数组的表示。
首先,用代码运行进行测试,验证的相关结果,
// C.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a[3][4] = { { 1, 3, 5, 7},
{ 9, 11, 13, 15},
{17, 19, 21, 23}
};
cout <<" a "<< endl;
cout << a << endl << endl;
cout << " a[0] *(a+0) *a" << endl;
cout << a[0] << " " << *(a+0) << " " << *a << endl << endl;
cout << " &a[1] a + 1 " << endl;
cout << &a[1] << " " << a + 1 << endl << endl << endl;
cout << " a[1] *(a + 1) " << endl;
cout << a[1] << " " << *(a + 1) << endl << endl;
cout << " a[1] + 2 *(a + 1) + 2 " << endl;
cout << a[1] + 2 << " " << *(a + 1) + 2 << endl << endl << endl;
cout << " *(a[1] + 2) *(*(a + 1) + 2) " << endl;
cout <<" "<< *(a[1] + 2) << " " << *(*(a + 1) + 2) << endl << endl;
return 0;
}
得到结果:
由此可以得出如下结果【仔细看清池一下的表格】:
虽然打印出来的结果一样,但是其含义不同,其数据类型可能不一样。且指针接收的值,不是说传递一个地址进去就可以得。还要其类型对应的上。指针之所以为派生类型,是因为其必须依靠基本数据类型才能够使用(参见本人的这篇博客数据类型、存储结构、static、extern)。
含义 |
地址 |
数据类型 | |
---|---|---|---|
a | 二维数组名,指向一维数组a[0],即0行的首地址 | 008FFAA4 | int (*)[4] |
a[0], *(a+0), *a | 0行0列的地址 | 008FFAA4 | int * |
&a[1], a+1 | 1行首地址 | 008FFAB4 | int (*)[4] |
a[1], *(a+1) | 1行0列元素,a[1][0]的地址 | 008FFAB4 | int * |
a[1]+2, *(a+1)+2 | 1行2列元素,a[1][2]的地址 | 008FFABC | int * |
*(*a[1]+2), *(*(a+1)+2) | 1行2列元素,a[1][2]的值 | 13 |
2.现在研究关于二维数组和指针的关系
怎么赋初值呢? 给一个二维数组。
正确赋值方式:
方式一:int(*p)[4] = a;
方式二:int(*p)[4] = &a[0];
容易错误的方式:
错误一:int(*p)[4] = a[0];
错误二:int(*p)[4] = &(a[0][0]);
那么由此可以得出结论,重点来了,敲黑板!!!【可以参考C程序设计 p250】
a[0], a[1], a[2]的类型为 int * 类型(指向整型变量);
而a的类型为 int (*)[4],指向 含有四个元素的 一维数组。
感觉此表比较重要,重点是容易理解。再回顾一遍。[和上面的是同一个表]