软考
APP下载

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

在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。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库