值拷贝&地址拷贝
变量拷贝
在传入参数时,我们要注意函数接收参数时是以什么样的方式接收,有些方式可能会改变原值,而有些方式不会。
#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; }
指针地址拷贝
很多人平时经常犯的一个错误是将指针直接以参数形式传入函数,在函数改变其值后认为它的原值也会跟着改变,就如下面 demo3
所示,其实它并不会改变原值,必须要传入地址才能将原值改变。
#include <bits/stdc++.h> using namespace std; //值拷贝 原来值不会改变 void demo3(int* p) { *p = 100; } //地址拷贝 原来值会改变 void demo4(int** p) { **p = 100; } int main() { int* a1; *a1 = 10; demo3(a1); printf("%d\n", *a1); //10 demo4(&a1); printf("%d", *a1); //100 return 0; }
注意:
我们平时设计函数时,为了能够让别人能够一眼看出函数传入的参数的作用是什么,我们可以遵循以下规则。
char buf[1024]; //用const来表示该参数传入的值是只读不可写的 void copy(char*, const char*); copy(buf, "heelo world");