数组分析

一、一维数组

如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级数组实现呢?

应该差不多吧,呵呵

但依然注意内存分配时,和二维数组一样一级一级分配时就行了




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值