值拷贝&地址拷贝
变量拷贝
在传入参数时,我们要注意函数接收参数时是以什么样的方式接收,有些方式可能会改变原值,而有些方式不会。
#include <bits/stdc++.h>
using namespace std;
//值拷贝 原来值不会改变
void demo1(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "demo1 " << a << " " << b << endl;
}
//地址拷贝 原来值会改变
void demo2(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
cout << "demo2 " << *a << " " << *b << endl;
}
//地址拷贝 原来值会改变
void demo3(int* c, int len)
{
for (int i = 0; i < len; i++)
c[i] = i;
}
int main()
{
//基础数据类型
int a = 10, b = 20;
demo1(a, b);
cout << a << " " << b << endl; //10 20
demo2(&a, &b);
cout << a << " " << b << endl; //20 10
//连续空间
int c[10];
demo3(c, 10);
for (int i = 0; i < 10; i++)
cout << c[i] << " ";
return 0;
}
指针地址拷贝
如果在函数内部修改指针本身的值(指针的指向),这不会影响到实参的指针。如果想要修改实参的指针,可以传递指针的引用或者二级指针作为函数的参数。
#include <bits/stdc++.h>
using namespace std;
//值拷贝 原来值不会改变
void demo3(int* p) {
p = new int;
*p = 50;
}
//地址拷贝 原来值会改变
void demo4(int** p) {
**p = 100;
}
int main() {
int* a1 = new int;
*a1 = 10;
demo3(a1);
printf("%d\n", *a1); //10
demo4(&a1);
printf("%d", *a1); //100
return 0;
}
总结起来,通过指针修改指针所指向的内存空间的值会影响到实参的值,但通过指针本身的修改(指针的指向)不会影响实参的指针。
更正: 之前这里的 demo3 函数中是直接修改了 a1 的值,但这会改变 a1 实参的值,非常感谢 @落九山 大佬指出错误,这里已经更正说法。
注意:
我们平时设计函数时,为了能够让别人能够一眼看出函数传入的参数的作用是什么,我们可以遵循以下规则。
char buf[1024];
//用const来表示该参数传入的值是只读不可写的
void copy(char*, const char*);
copy(buf, "heelo world");