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

简介: 【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;
}


指针地址拷贝

很多人平时经常犯的一个错误是将指针直接以参数形式传入函数,在函数改变其值后认为它的原值也会跟着改变,就如下面 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");


目录
相关文章
|
8月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
1022 1
|
8月前
|
存储 人工智能 算法
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
137 0
|
8月前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
344 0
|
8月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
139 1
|
8月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
226 1
|
8月前
|
安全 C++
c++拷贝控制(二)
c++拷贝控制(二)
55 0
|
3月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
65 2
|
7月前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
664 18
|
6月前
|
机器学习/深度学习 算法 搜索推荐
|
7月前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)