【C语言复习(十八)】数组参数和指针参数

1、退化的意义

C语言复习(十三)】数组和指针的第6小点中有说到,数组在作为函数参数时会退化为一个指向数组元素的指针,那么为什么C语言中的数组参数会退化为指针??

原因可能如下:

C语言中只会以值拷贝的方式传递参数;

不管是传值操作还是传址操作,其实本质上传递的还是值,这个概念在学过C++的朋友应该能明白,C++中就还有一个引用传递,传递的是地址(实参为变量名,形参为变量的引用,接收的是实参的地址);

当向一个函数传递数组时,根据虚实结合,理论上可以把整个数组拷贝一份给形参,然后再数组中使用,但是这样效率极低,肯定不符合C语言高效的特点;另外的一种方法就是将数组名看作常量指针,传递数组首元素地址给形参,这样实参和形参公用一段内存,效率提高不少!因此这也就是数组参数退化为元素指针的原因了!

2、二维数组参数

上面说到了一维数组参数的退化问题,这个在二维数组中同样存在,因为C语言中二维数组由一维数组嵌套组成;二维数组中的每个元素都是一个一维数组;

二维数组参数中的第一维的参数可以省略,需以另外的参数给出!(即是二维数组的列数)

退化示例:

void func(int a[5]);==> void func(int a[]) ==> void func(int* a);

void func(int a[3][3]);==>void func(int a[][3]);==>void func(int (*a)[3]);

3、退化后的等价关系

  

4、注意事项

C语言中无法向一个函数传递任意维数的多维数组,因为参数退化后,他们的指针类型不一样!

为了保证正确的指针运算,必须提供除第一维之外的所有维长度;第一维长度要以另外的参数给出,其他维的长度可以计算出来!

一维数组参数 -- 必须另外提供一个标示数组长度的参数,因为参数退化后这个长度信息将不存在! 

二维数组-- 不能直接传递给函数,会先经过退化为指针;

三维或更多维数组参数 --- 无法使用!

5、传递与使用二维数组

#include <stdio.h>
 
#define DIM(p,type)  (sizeof(*p)/sizeof(type))
 
void matrix(int (*ma)[3],int row)
{
    //计算列数
    int col=DIM(ma,int);
    //遍历数组
    int i=0,j=0;
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            printf("%d\t",*(*(ma+i)+j));
        }
    }
}
int main()
{
    int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
    matrix(a, 3);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值