|
发表于 2015-3-28 17:39:00
|
显示全部楼层
本帖最后由 ryxcaixia 于 2015-5-14 08:29 编辑
以最简单的例子来说, 一维指针数组
指针数组是一个数组, 存了一堆指针, 是指针的集合, 由一个二级指针指向这个一维指针数组, 如 int** Arr = [int* a, int* b,.....]类似这种
而每个指针又指向一个地址, 如为一级指针, 比如a或b 他们各自指向一个数列
但是任何的二维(多维)实际上都是一维的, 即堆栈上一字排开
以下面的例子来说, 我创建了二维数组, 即可以用二维数组的方式访问, 也可以用一维的方式访问
创建一维数组, 也可以用二维数组的方式访问, 也可以用一维的访问.int main()
{
int Height = 5;
int Width = 10;
// 这是普通的二维数组
int TwoDimen[5][10] = {0};
for (int i = 0; i != Height; i++)
for (int j = 0; j != Width; j++)
TwoDimen[i][j] = i * j;
// 对二维数组按照二维数组的方式访问
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << TwoDimen[i][j] << ' ';
cout << endl;
}
// 对二维数组按照一维数组的方式访问
cout << "-----------------------------------------------------------------" << endl;
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << *(*(TwoDimen + i)+j) << ' ';
cout << endl;
}
// 对二维数组按照一维数组的方式访问
cout << "-----------------------------------------------------------------" << endl;
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << *(*TwoDimen + i*Width + j) << ' ';
cout << endl;
}
cout << "-----------------------------------------------------------------" << endl;
// 这是一维数组
int* OneDimen = (int*)malloc(sizeof(int) * (Height * Width));
for (int i = 0; i != Height; i++)
for (int j = 0; j != Width; j++)
OneDimen[i*Width + j] = i * j;
// 对一维数组按照已维数组的方式访问
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << OneDimen[i*Width + j] << ' ';
cout << endl;
}
cout << "-----------------------------------------------------------------" << endl;
// 对一维数组按照二维数组的方式访问
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << *((OneDimen+i*Width) + j) << ' ';
cout << endl;
}
free(OneDimen);
OneDimen = NULL;
return 0;
}
可以看出, 任何指针数组内的成员(一个一级指针), 与下一个成员间隔的距离都是28H, 即十进制的40, 即sizeof(int) * 10, 十个整形元素
所以CPU不认识一维指针数组还是二维指针数组, 他只认地址, 而定义成多级指针不过是方便程序员书写, 而在最底层(本例中的整形指针数组), 都是一字排开
以上的情况多见于矩阵, 如函数指针数组, 即数组内的每个指针指向了每个函数的首地址, 这样的自然不是连续的.一言以蔽之, 指针数组就是存了一堆地址的数组, 这些地址可以是某个数列或矩阵的地址, 可以是某个元素的, 可以是某个函数的, 可以是某个资源的, 前提是类型都要一样, 然后把这些地址存到一个地方, 方便程序员进行读写操作访问等
|
|