【C++知识点】值拷贝&地址拷贝

C/C++知识点

值拷贝&地址拷贝

变量拷贝

在传入参数时,我们要注意函数接收参数时是以什么样的方式接收,有些方式可能会改变原值,而有些方式不会。

#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");
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值