c语言蛋nt数组传给形参,C语言中参数传递精.docx

.参数传递

函数的形参的初始化和变量的初始化一样,如果形参具有非引用类型,则复制实 参的值,如果形参为引用类型,则它是实参的别名。

非引用实参

普通的非引用类型的函数通过复制对应的实参实现初始化。当用实参副本初始

化形参时,函数并没有调用所传递的实参本身,因此不会修改实参的值。

注解:非引用形参表示对应实参的局部副本,对这类行参的修改仅仅改变了局部 副本的值,一旦函数执行结束,这些局部变量的值也就没有了。

指针形参

指针形参与其他非引用类型的行参一样,如果将新指针赋给行参,主调函数使用 的实参指 针的值没有改变。事实上被复制的指针只影响对指针的赋值。指针形参 是con st类型还是非const类型,将影响函数调用所使用的实参。

const 行参

在调用函数时,如果该函数使用非引用的非const形参,则既给该函数传递const 实参也 可传递非const的实参(因为改变形参不影响con st的实参所以const实参不 会被改变。如果将形参定义为非引用的con st类型,则在函数中,不可以改变实参的 局部副本,由于实参 是以副本的形式传递,因此传递给函数形参既可是const也可是 非const对象。

注意:尽管函数的形参是const但是编译器却将该行参声明视为普通的int型。

void fcn(const int i;

void fen (i nt i;

为了兼顾C语言,认为这两种定义并不区别

C.复制实参的局限性

不适合复制实参的情况包括:

当需要在函数中修改实参的值时

当需要以大型对象作为实参传递时,对实际的应用而言,复制对象所付出的时间 和存储空间代价往往很大。

但没有办法实习对象的复制时

对于以上几种情况,有效的办法是将形参定义为引用或指针。

引用实参

与所有引用一样,引用形参直接关联到其所绑定的对象,而并非这些对象的副 本。定义引

用时,必须用与该引用绑定的对象初始化该引用。引用形参以完全相同的方式

工作。每次调用函数时,引用形参被创建并与相应的实参关联。

使用引用形参返回额外的信息

函数只能返回单个值,但有时候函数有不止一个的内容需要返回。这时候我们

可以通过函 数传递一个额外的引用实参,用于返回额外的信息。

利用const引用避免复制

对于大型对象复制效率太低了 ,有些类型甚至无法复制,利用const引用就可以 避免复制,引用形参是引用,所以不复制实参,又因为形参是const引用,所以不能使该 引用来修改实参。

更灵活的指向const的引用

如果函数具有普通的非const引用形参,则不能通过const对象进行调用,因为函 数可以修改传来的参数,但这样就违背了实参的const特性。

int in cr(i nt &val

{

retur n ++val;

}

int main(

{

short v1=0;

const in t v2=42;

int v3=incr(v1; //error, v1 不是整型

v3=incr(v2; //error, v2 使 const 对象

v3=i ncr(0; //error,字面值不是左值

v3=incr(v1+v2; //error,加法不能作为左值

int v4=incr(v3; //ok, v3 是一个非 const 的整型值

}

问题的关键是非const引用形参只能与完全相同的非const对象关联。

最佳实践:应该将不需要修改的引用定义为 const引用。普通的非const引用形 参在使用 时不太灵活。这样的形参既不能被const对象初始化,也不能用字面值或

产生右值的表达式初始化。

传递指向指针的引用

实现两个指针的交换:

void ptrsw ap(i nt* & v1, i nt* &v2

{

int* temp=v2;

v2=v1;

v仁temp;

}

行参int* &val的定义从右向左理解:v1是一个引用,与指向int型对象的指针相 关联。也就是说,v1只是传递进ptrswap函数的任意指针的别名。

vector和其他容器类型的行参

最佳实践:通常,函数不应该有vector或其他标准容器库类型的实参。调用含

有普通的非 引用vector行参的函数将会复制vector的每一个元素。从避免复制

vector的角度出发,应考虑将形参声明为引用类型。

数组形参

a.数组形参的定义

数组会被自动转换为指针,通常,将数组形参直接定义为指针要比数组语法更好 这样就明确的表示,函数操纵是指向数组元素的指针,而不是数组本身。

当编译器检查数组形参关联的实参时,他只会检查实参是不是指针,指针的类型 和数组元 素的类型是否匹配,而不会检查数组的长度。

数组实参

和其他类型一样,数组形参可定义为引用或非引用类型,大部分情况下,数组以 普通的非引用类型传递,此时数组会转换为指

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值