数组作为函数的参数

本文内容摘自《C和指针》

传值与传址

《C和指针》函数的参数一节(7.3节)指出,C函数的所有参数均以“传值调用”方式进行传递,这意味着函数将获得参数值的一份拷贝。这样函数可以放心地修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数。

如果被传递的参数是一个数组名,由于数组名的值是一个指向数组第一个元素的指针,因此实际传递给函数的是指向数组起始位置的指针的一份拷贝,该指针同样指向数组起始位置。在函数内部对指针形参进行间接访问操作,实际访问的是原数组的元素。

对于传值和传址:

1. 传递给函数的标量参数是传值调用的。

2. 传递给函数的数组参数在行为上就像它们是通过传址调用的那样。

一维数组作为函数的参数

声明数组参数可以采用2种方式:

int strfunc(char *str);    //推荐使用
int strfunc(char str[]);

由于数组名作为参数传递给函数时,函数实际接收到的是一个指针,因此第一种声明是更为准确的。在函数内部sizeof(str)的值将会是字符指针的长度,而不是数组的长度。

编译器同样接受第二种声明形式。数组形参无需写明它的元素数目,是因为函数并不为数组参数分配内存空间,形参只是一个指针。因此数组形参可以与任何长度的数组匹配。如果函数需要知道数组的长度,它必须作为一个显式的参数传递给函数。

多维数组作为函数的参数

一维数组作为函数形参,在声明时可以把它写成数组的形式,也可以把它写成指针形式。但对于多维数组,只有第一维可以进行如此选择,这里的关键在于编译器必须知道第2个及后面各维的长度才能对各下标进行求值,因此在原型中必须声明这些维的长度。你可以使用下面2种形式中的任意一种:

void func(int (*mat)[10]);
void func(int mat[][10]);

但写成下面的原型是不正确的:

void func(int **mat);

这个例子把mat声明为一个指向整型指针的指针,它和指向整型数组的指针并不是一回事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值