对于二维数组和二维指针的内存的分配
这里首选说一下一维指针和一维数组的内存分配情况。
一维:
数组:形如int a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体表示,也就是通过a我们能找到这五个元素。注意:a是代表数组第一个元素的首地址。&a是代表数组的地址,虽然它们的值相同。
指针: int *p = NULL;这里p是一个指针,它指向的是计算
机内一块存储int类型的内存。P = a;就是让p等于刚才申请的数组的第一个元素的地址。所以通过p我们也能找到那5个元素所以P[i]跟a[i]的作用一样。
注意:
1:int *p = NULL; p的大小在32位机器是4,即使p=a;之后p的sizeof(p)仍然等于4。
2:在声明之后,数组必须分配内存进行初始化。而指针一般是动态分配其指向的内存。
3:不要混淆指针和数组,指针就是指针,数组就是数组,只是数组在一定条件下可以转换成指针。不要将指针和数组混淆。(例如:指针有++,--操作,数组则不可以)。
一维指针的动态内存分配:
int *p = NULL;
p = new int[N];
千万别忘了delete
delete [] p;
p = NULL;
二维数组的内存分配
int a[2][3]; 这里分配了一个2X3=6个int大小的数组。二维数组的第二个维度3不能省略。
二维数组的内存在计算机内也是连续的一片地址,只不过每3个元素构成一个一维数组a[i],这里的a[i]代表维度为3的数组的第一个元素的地址。所以a[i][j]的访问跟a[i]的访问也就清楚了。这里的a[i]其实是一个一维数组的第一个元素的地址。
对于二维数组做实参,我们通常用一维指针处理,例如:
1 #include <iostream> 2 void test(int *p) 3 { 4 for (int i = 0;i<3;++i) 5 { 6 for(