一、一维数组
如int p[5], p是指向数组第一个元素的常量指针,可以通过下标操作,但不能直接执行类似p+1的操作
若为char类型,printf("%s",p)即可输出,整型只能逐个输出。
一般可把p直接传给函数,事实参数传递后也是当作指针来操作的
那&p为何方神圣呢,后来发现他将变成数组指针即( *p)[5],他指向的是p[5]这个数组,不再是元素地址,所以也不能进行指针移动,要对数组操作,只能p[0][i]
p[0]指向p[5],再按正常数组操作即可。那p[1]是什么?他将变成指向下一个包括五个int元素的数组,鬼知道是什么
二、二维数组
经过长时间的琢磨、验证,发现一般对二维数组操作分两种情况
char p[3][5];
1、直接把p传给函数
其实当把二维数组名传递给函数的时候,会自动转换为数组指针即(*p)[5],就像一维数组会自动转成指针一样,是等价的
通常函数可这样定义,fun(int n, char (*p)[5]),n表示第一维数或行数
其实你直接定义为fun(char p[3][5])或fun(int n , char p[][5])也一样,反正二者等价
2、转换为指针数组
这就需要事先定义一个指针数组char *q[5],然后将各行指针赋予q
这里只能,q[0] = p[0]
q[1] = p[1]
q[2] = p[2]
然后把q传给函数
犯过这样的错误? 二维数组名为二维指针?其实不是,应该说是指向二维数组第一行元素的行指针,也就是一级指针,p+1就一向下一行了
所以传递p,函数定义为二级指针必然会出错,我就曾多次犯这样的错误,还百思不得其解。
三、数组动态内存分配问题
动态数组我们经常遇到,对于数组大小不确定的时候只能用动态数组,动态数组是用指针实现的。
1、一维动态数组
这个简单,比如n 大小整型数组 int *p = NULL;
p = (int *)malloc(sizeof(int) * n);当然养成习惯对内存分配的有效性检查
2、二维动态数组
假设是n行m列 整型数组
int **p = (int **)malloc(sizeof(int)*n*m)?
曾经我也是这样做的,那就大错特错了,运行必然出错!!好好理解下二维数组就知道不应该这样了,还记得二维数组名是指向第一行的行指针吗?既然如此那p[0....n-1]明明是指针,你给分配int类型内存行吗?
所以动态二维内存分配必须先分配行指针的内存,再对每个行指针分配内存(存储各列)
p = (int **)malloc(sizeof(int *) * n);
for(i=0; i<n; i++)
p[i] = (int *)malloc(sizeof(int) * m);
当然每次对指针分配内存别忘检查
3、多维动态数组
既然二维数组可用二级指针实现,那m维数组是不应该用m级数组实现呢?
应该差不多吧,呵呵
但依然注意内存分配时,和二维数组一样一级一级分配时就行了