希赛考试网
首页 > 软考 > 软件设计师

简述函数中值传递和地址传递的区别

希赛网 2024-01-14 07:52:21

在C++语言中,函数传递参数的方式可分为值传递和地址传递两种方式。在函数中调用变量时,这两种方法也有着显著不同的效果。

区别一:传递实参

在函数调用时,值传递是将实参中的值拷贝给形参,即开辟一块新的内存空间来存储实参的值。而地址传递则是将实参的地址传递给形参,形参指向实参所在内存地址的位置。如下示例代码:

```

void swap(int a, int b) // 值传递方式

{

int temp = a;

a = b;

b = temp;

}

void swap(int *a, int *b) // 地址传递方式

{

int temp = *a;

*a = *b;

*b = temp;

}

int main()

{

int x = 1, y = 2;

swap(x, y); // 值传递

swap(&x, &y); // 地址传递

return 0;

}

```

在值传递方式中,函数内部修改的是形参的值,不会对实参造成影响。在上述示例代码中,x和y的值不发生改变。而在地址传递方式中,函数内部修改的是实参内存中的值,因此函数调用结束后,实参的值发生了改变。

区别二:内存开销

在值传递方式中,实参和形参在内存中存储的位置不同,因此需要进行拷贝操作,导致了一定的内存开销。而在地址传递方式中,实参和形参在内存中存储的位置相同,不需要进行拷贝操作,从而节省了内存开销。但是,这种方式需要保证函数内部不会修改实参的地址所保存的内容,否则会破坏实参的值。

区别三:对指针的影响

在值传递方式中,函数内部对形参的修改不会影响到实参指向的指针。而在地址传递方式中,函数内部对形参的修改会影响到实参指向的指针。因此,在使用地址传递方式时,需要进行安全检查,以防止不必要的指针错误。如下示例代码:

```

void foo(int *p) // 地址传递方式

{

int a = 10;

p = &a;

}

int main()

{

int x = 1;

int *p = &x;

foo(p);

cout << *p << endl;

return 0;

}

```

在上述示例代码中,函数foo内部修改了形参p的值,但是不会影响实参p指向的内存地址。因此,输出结果为1。

扫码领取最新备考资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件