首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++:误解内存地址和指针的复制值

C++是一种通用的高级编程语言,被广泛应用于系统软件、游戏开发、嵌入式系统等领域。在C++中,内存地址和指针是两个重要的概念,但常常会被误解为复制值。

内存地址是指内存中存储数据的位置,可以看作是数据在内存中的唯一标识。每个变量在内存中都有一个地址,通过地址可以访问和操作变量的值。内存地址通常以十六进制表示,例如0x7ffd5a9d6a50。

指针是一种特殊的变量类型,它存储了一个内存地址。通过指针,我们可以间接地访问和操作内存中的数据。指针变量可以通过取地址操作符&来获取变量的地址,并通过解引用操作符*来访问指针指向的内存中的值。

误解1:内存地址和指针的复制值 有时候,初学者可能会误解为将内存地址或指针直接赋值给另一个变量,这样会导致两个变量指向同一块内存地址,从而修改其中一个变量的值会影响到另一个变量。实际上,赋值操作只是将一个指针的值(即内存地址)复制给另一个指针变量,而不是复制指针指向的内存中的值。

例如,以下代码片段展示了这个误解的情况:

代码语言:txt
复制
int a = 10;
int* ptr1 = &a;
int* ptr2 = ptr1; // 错误的理解为复制指针指向的值
*ptr2 = 20; // 修改ptr2指向的内存中的值
cout << *ptr1 << endl; // 输出结果为20,实际上ptr1和ptr2指向同一块内存

正确的理解是,指针变量存储的是内存地址,而不是内存中的值。因此,赋值操作只是将一个指针变量的值(即内存地址)复制给另一个指针变量,两个指针变量仍然指向同一块内存。

为了避免这种误解,我们应该清楚地区分内存地址和指针的概念,并正确理解赋值操作的含义。

总结:

  • 内存地址是数据在内存中的位置,指针是存储内存地址的变量。
  • 赋值操作只是将一个指针的值(即内存地址)复制给另一个指针变量,而不是复制指针指向的内存中的值。
  • 正确理解内存地址和指针的概念,避免误解赋值操作的含义。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云C++ SDK:腾讯云提供的C++开发工具包,用于访问和操作腾讯云的各种云服务。详情请参考:https://cloud.tencent.com/document/sdk/Cpp
  • 云服务器(CVM):腾讯云提供的弹性云服务器,可满足各种计算需求。详情请参考:https://cloud.tencent.com/product/cvm
  • 云数据库MySQL版:腾讯云提供的高性能、可扩展的云数据库服务,适用于各种规模的应用。详情请参考:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云容器服务:腾讯云提供的容器化部署和管理服务,支持使用C++构建和运行容器化应用。详情请参考:https://cloud.tencent.com/product/ccs
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】This指针复制构造函数

this指针 在每个成员函数中,都包含一个特殊指针。 这个指针名字是固定,就是this指针。 this指针是指向类对象指针,它是当前被调用所在对象地址!...this指针是指向本类对象指针,它作为参数传递给成员函数 this指针是隐式使用。由编译器自动实现,我们不必人为在形参中添加this指针。...因为this表示这个对象指针,所以*this就表示这个对象了 (*this).调用成员变量/函数this->调用成员变量/函数,是一样效果!...注意给*this添加括号,因为.运算符优先级比较高 复制构造函数 复制构造函数普通构造函数有一些相似处,也没有返回,类名作为函数名!...func1中形参time 也会调用一次复制构造函数 cout << time.getHour() << endl; return time;//time在返回时候会复制给返回,这个时候会调用复制构造函数

80720

C++ 引用指针内存地址、创建方法及应用解析

注意你可能在你程序中得不到相同结果。为什么知道内存地址很有用呢?引用指针C++ 中非常重要,因为它们使你能够操作计算机内存中数据 - 这可以减少代码并提高性能。...C++ 指针创建指针可以使用 & 运算符获取变量内存地址:string food = "Pizza"; // 类型为 string 食物变量cout << food; // 输出 food (...Pizza)cout << &food; // 输出 food 内存地址(0x6dfed4)然而,指针是一种将内存地址作为其变量。...注意指针类型必须与你正在处理变量类型匹配。使用 & 运算符存储名为 food 变量内存地址,并将其分配给指针。现在,ptr 持有 food 内存地址。...总而言之,引用指针都是 C++ 中强大工具,可以用于高效地操作内存和数据。选择使用引用还是指针取决于具体情况。

14210

详解c++指针指针指针引用

展示一下使用指针指针指针引用修改传递给方法指针,以便更好使用它。...(这里说指针指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针复本传递给了方法,也可以说传递指针指针传递。...如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改指针copy而不是指针本身,原来指针还保留着原来 。...输出是两个2 使用指针指针 展示一下使用指针指针做为参数 void func(int **p) { *p = &m_value; // 也可以根据你需求分配内存 *p...我们看一下 func(int **p)这个方法 p:  是一个指针指针,在这里我们不会去对它做修改,否则会丢失这个指针指向指针地址 *p:  是被指向指针,是一个地址。

1.3K60

C++函数指针指针函数、返回为函数指针函数浅谈

C++函数指针指针函数、返回为函数指针函数浅谈 引言 函数指针指针函数是C中重要而容易混淆概念,博主将通过两个实例来说明这两个截然不同概念。...而返回为函数指针指针函数就更难理解了,放在文章最后来介绍。 函数指针 函数指针是一种特殊 指针,它指向函数入口。...指针函数是一种返回指针 函数。...return 0; } 返回为函数指针函数 其实在搞懂了函数指针指针函数后,这个概念并不难懂,其实这就是一个复杂一点指针函数,因为他返回为函数指针。...*f)())这是一个指针函数,返回指针,它有一个参数,参数为一个函数指针(返回为void,无参数列表函数) void (* set_malloc_handler(void (*f)()))()

1.5K10

C++奇迹之旅:内联函数auto关键推导指针

auto使用细则 auto与指针引用结合起来使用 用auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必须加& int main() { int x...这是 C++ 语言一个特性限制。 在 C++ 中,数组是一种特殊数据结构,它大小元素类型在编译时就必须确定。而 auto 关键字是用来进行类型推导,它无法推导出数组大小元素类型。...(关于迭代器这个问题,以后会讲,现在提一下,没办法讲清楚,现在大家了解一下就可以了) 指针nullptr(C++11) C++98中指针 在良好C/C++编程习惯中,声明一个变量时最好给该变量一个合适初始...这是因为在 C++ 中,0 可以隐式转换为任何指针类型,所以将 NULL 定义为 0 是合理 #else//如果不是 C++ 编译环境,则执行这个代码块。...在使用nullptr表示指针时,不需要包含头文件,因为nullptr是C++11作为新关键字引入。 2.

13710

C++ 指针句柄区别

指针是一个变量,其为另一个变量地址,即,内存位置直接地址,指针对应着一个数据在内存中地址,得到了指针就可以自由地修改该数据。...句柄实际上是一种指向某种资源指针,或者说是一种指向指针指针。...所以windows 提供了专门设计了句柄为了解决指针指向对象内存地址不断变化,由句柄来指向当前对象指针。...系统专门为各种应用程序腾出了一定内存地址(句柄)专门用来记录这些变化地址(这些内存地址就是指向指针指针),这些内存地址本身是一直不变化。...windows内存管理器在移动某些对象之后,他会将这些对象新内存地址传给句柄,告诉他移动后对象去了哪里。

2.4K30

c++指针引用区别

目录 前言: 1、引用概念上是定义一个变量别名,而指针是存储一个变量地址。 2、引用在定义时必须要初始化,但是指针没有要求。...6、引用自加即引用实体增加1,指针自加即指针向后偏移一个类型大小。 7、有多级指针,但是没有多级引用。 8、访问实体方式不同,指针需要显示解引用,引用则由编译器自己处理。...9、引用比指针使用起来相对安全。 ---- 前言: 指针引用区别经常在面试中出现, 下面总结出以下区别 1、引用概念上是定义一个变量别名,而指针是存储一个变量地址。...4、没有NULL引用,但有NULL指针。 5、在sizeof中含义不同:引用结果为引用类型大小,但指针始终是空地址空间所占字节个数(32位平台下占用4个字节,64位占用8字节)。...6、引用自加即引用实体增加1,指针自加即指针向后偏移一个类型大小。 7、有多级指针,但是没有多级引用。 8、访问实体方式不同,指针需要显示解引用,引用则由编译器自己处理。

51930

C++ this指针理解作用

C++ 程序到 C 程序翻译 要想理解 C++ this 指针,我们可以先把下面的 C++ 代码转换成 C 代码: ?...m_price 变量是 Car 类成员变量,那么我们可以把 Car 类成员变量翻译成如下 C 代码: ?...在这里我们把上面 C++ 程序 main 函数翻译 C 程序,是这样: ? 所以最终把上述 C++ 程序 转换成 C 程序代码如下: ?...this 指针作用 其作用就是指向成员函数所作用对象,所以非静态成员函数中可以直接使用 this 来代表指向该函数作用对象指针。 下面的例子可以很好说明 this 作用: ?...小结 通过将 C++ 程序翻译成 C 程序方式,来理解 this 指针,其作用就是指向非静态成员函数所作用对象,每个成员函数第一个参数实际上都是有个默认 this 指针参数; 静态成员函数是无法使用

1K20

C++ 指针引用区别

指针是C系语言一大特色,也在很大程度上体现着C/C++精髓,一个数据对象内存地址称为该数据对象指针。...引用是C++对C语言一个补充,它作用是为一个变量起一个别名。...换句话说一个引用在声明时候就必须要初始化(除了作为函数参数),而指针是没有这个问题,我们在定义一个指针但是不让它指向任何对象,是完全可以: //错误,需要初始 int &b;...这个问题上面的其实是对应,既然指针在定义时候可以为空,但是一个为空指针对实现一个功能是没有用,为了代码鲁棒性,我们必须时刻考虑指针为空情况,这在指针作为函数参数时尤为常见。...由于引用声明初始化总是在一起,所以不可能让一个对象引用指向另一个,这完全没有道理,假设a引用是c,那么在执行int &c=b;就重定义了,如果执行c = b;,那么只是把b赋值给c,也就是

95780

C++对象赋值复制

13.对象赋值复制 对象赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现,即将一个对象成员一一赋值给另一对象对应成员...对象1 = 对象2;//浅拷贝 浅复制 Box *b1 = new Box(1, 2, 3); //C++类Java对象声明 必须使用指针 Box *b2; b1 = b2; //浅拷贝 delete...b2赋值时,回到时b2p指针b1p指针指向同一个地方 即b1p //当程序运行结束时,会导致同一个内存在各自析构函数中释放,累计释放了2次。...//深拷贝 深复制 补充:深拷贝浅拷贝区别: https://www.zhihu.com/question/36370072 对象复制:用一个已有的对象快速地多个完全相同对象。...而对象复制则是从无到有地建立一个新对象,并使它与一个已有的对象完全相同(包括对象结构成员)。

3.1K90

指针变量传址

int *pRes,在函数体中 new了一块内存并赋值 12,将内存地址赋值给指针 pRes。...原因:在func函数调用过程中,形参实参传递使用了传递方式,这种情况下,形参变量在函数体内发生了变化,在函数结束之后,形参变量随之释放,不能把变化结果返回给实参。...传引用区别联系 传:实参拷贝传递给形参。...复制完毕后实参地址形参地址没有任何联系,对实参形参地址修改不会影响到实参, 但是对形参地址所指向对象修改却直接反应在实参中,因为形参指向对象就是形参对象。...无论传还是传指针,函数都会生成一个临时变量,但传引用时,不会生成临时变量, 传时,只可以引用而不可以改变,但传引用时,可以改变, 传指针时,只可以改变指针所指内容,不可以改变指针本身,但传指针引用时

2K30

指针变量传址

int *pRes,在函数体中 new了一块内存并赋值 12,将内存地址赋值给指针 pRes。...原因:在func函数调用过程中,形参实参传递使用了传递方式,这种情况下,形参变量在函数体内发生了变化,在函数结束之后,形参变量随之释放,不能把变化结果返回给实参。...传引用区别联系 传:实参拷贝传递给形参。...复制完毕后实参地址形参地址没有任何联系,对实参形参地址修改不会影响到实参, 但是对形参地址所指向对象修改却直接反应在实参中,因为形参指向对象就是形参对象。...无论传还是传指针,函数都会生成一个临时变量,但传引用时,不会生成临时变量, 传时,只可以引用而不可以改变,但传引用时,可以改变, 传指针时,只可以改变指针所指内容,不可以改变指针本身,但传指针引用时

2.7K40

C++

在C/C++中,左(lvalue)(rvalue)是用于规定表达式(expression)性质。C++中表达式要不然是左,要不然是右。...但是当来到C++时,二者理解就比较复杂了(PS:有对象真是麻烦) 简单归纳: 当一个对象被用作右时候,用是对象(内容);当对象被用作左时候,用是对象身份即在内存中地址。...左是代表一个内存地址,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作。 在需要右地方可以用左来代替,但是不能把右值当成左使用。...取地址符作用于一个左运算对象,返回一个指向该运算对象指针,这个指针是一个右。...内置解引用运算符、下标运算符、迭代器解引用运算符、stringvector下标运算符求值结果,都是左。 内置类型迭代器递增递减运算符作用于左运算对象所得结果也是左

1.7K30

C++

C++C++时间也不短了,突然发现,还不知道左是什么,毕竟学C++不够系统,详细。...当然,以常量对象为代表某些左实际上不能作为赋值语句左侧运算对象(本人理解:功能不全;除了自己初始化,一般不用作左使用。) 个人理解:左一般地址有关系。...左转换一个重要原则:在需要右地方可以使用左来替代,但是不能在需要左(位置)地方,使用右。当然,也有一种例外情况(参见P470,还没看到)。...P149:左是指那些求值结果为对象或函数表达式。一个表示对象非常量左可以作为赋值 关于运算符操作数返回左右 ?...对于 1),这 c 是一致,2) 却是 C++ 中所独有, 因此,如果你看到 C++ 中如下写法,千万不要惊讶: class cs { public: cs(int i):

2.3K30

C++

大家好,又见面了,我是你们朋友全栈君。 一、前言 一直以来,我都对C++中左(lvalue)(lvalue)概念模糊不清。...我认为是时候好好理解他们了,因为这些概念随着C++语言进化变得越来越重要。 二、左——一个友好定义 首先,让我们避开那些正式定义。在C++中,一个左是指向一个指定内存东西。...另一方面,右就是不指向任何地方东西。通常来说,右是暂时短命,而左则活很久,因为他们以变量形式(variable)存在。...对于左x,你可以做像这样操作: int* y = &x; //ok 在这里我通过取地址操作符&获取了x内存地址并且把它放进了y。...一个右可以被转化为左吗?不可以,它不是技术所限,而是C++编程语言就是那样设计

1.7K20

C++指针引用区别

C++中,指针引用经常用于函数参数传递,然而,指针传递参数引用传递参数是有本质上不同指针传递参数本质上是 传递方式,它所传递是一个地址。...,而指针不是 (引用比指针多了类型检查) 这几天看重温了下《高质量C/C++编程指南》 《More Effective C++》对于里面的引用指针觉得写得很精辟,同时在网上也找了些别人写总结,引用过来大家分享下...引用是操作受限了指针(仅容许取内容操作)。 ★《高质量C/C++编程指南》6.6     引用是C++概念,初学者容易把引用指针混淆一起。...引用主要功能是传递函数参数返回C++语言中,函数参数返回传递方式有三种:传递、指针传递引用传递。     以下是“传递”示例程序。...(这有一个有趣例外,参见条款30) 当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要语义误解时,你不应该使用指针。而在除此之外其他情况下,则应使用指针

4.9K82

C++中this指针理解用法

大家好,又见面了,我是你们朋友全栈君。 关于this指针一个精典回答: 当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。...对于一个类实例来说, 你可以看到它成员函数、成员变量, 但是实例本身呢? this是一个指针,它时时刻刻指向你这个实例本身。...个人理解: (ps:class类就好比这座房子,this就好比一把钥匙,通过钥匙来打开了这座房子门,那么里面的东西就随意你取用了) this是指向实例化对象本身时候一个指针,里面存储是对象本身地址...,通过该地址可以访问内部成员函数成员变量。...例如a.fun(1)fun(&a,1) this使用:1)在类非静态成员函数中返回对象本身时候,直接用return *this(常用于操作符重载赋值、拷贝等函数)。

64730
领券