首页 > 编程语言 >C++ 指针,指针引用,二级指针作为实参传入函数体,形参改变指向的问题

C++ 指针,指针引用,二级指针作为实参传入函数体,形参改变指向的问题

时间:2024-03-22 19:04:25浏览次数:30  
标签:形参 指向 C++ 内存 pD 实参 指针

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一、形参指向变化,实参指向不变

前提了解:无论是值传递,指针传递,引用传递,形参和实参都是完全不同的两个变量,都有各自不同的内存地址。只不过形参的生命周期只限于函数体的{}里。
在这里插入图片描述
此时输出*pD = 2;解释如下:

代码运行到箭头处,发现实参传入函数体后(int *b = pD之后)实参就已经失效了,所以得出函数调用时候实参的唯一用途就是将其值传给形参。

之前所学的地址传递会改变实参本质是:地址传递后形参去操控内存改变了内存中的值,进而导致实参内存的值变化。
而该图片中只是形参这个指针变量b指向发生了变化,与实参pD没有任何关系。

二、指针引用传递 改变实参指向

在这里插入图片描述
此时输出*pD = 1;解释如下:

传参时:int* &b = pD;
形参b是pD的引用变量,类型是int*
b=&a;//mean操控引用变量指向内存的值,也就是操控了实参pD指向内存的值,从而形参指向改变,实参指向跟着改变。

三、二级指针**传递 改变实参指向

二级指针:指向的内存中存储的是一级指针,该一级指针指向的内存中的才是真正的数据。
在这里插入图片描述
此时输出*pD = 1;解释如下:

b和&pD都是二级指针。都是嵌套两层内存之后存数据。但切记:也是两个完全不同的变量,只是传值后指向一样了。如下:
在这里插入图片描述
传参时:int* * b = &pD; 传参过程如上图;传参后,形参&pD同样在该代码块失效。
*b = &a; 对二级指针b外层内存地址的数据(也就是B)进行更改,从指向B改为指向了a的地址(1),从而原实参(二级指针)最内层内存地址中存的数据也变为了1;

标签:形参,指向,C++,内存,pD,实参,指针
From: https://blog.csdn.net/m0_54984588/article/details/136847298

相关文章

  • C++中char,char*,char[],string存储中文的问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用char,char*,char[],string存储中文二、内存中是乱码,但是可以正常输出三、解决方法:w_char,前言学习时遇到的问题,如有不对,欢迎大佬们批评指正!一、使用char,char*,char[],string存......
  • [C++提高编程](一):模板----函数模板
    目录函数模板作用函数模板的语法注意事项普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性案例--通用数组选择排序从大到小模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。函数模板作用建立一个通用函数,其函数返回值类型......
  • C与指针1.0
    //更新中,本星期结束前,会加上一些指针习题+总结出思维导图//用途:分享,仅供参考,自己复习一.指针与地址1.指针简介定义:指针是用来访问内存的,相当于房间的房间号便于查询,提高效率内存单元的编号==地址==指针大小:4/8个字节,只要是指针变量就是,和类型无关x86(32位机器,32根总线......
  • C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错
    C++类继承与类组合,默认与含参的构造先后顺序 易错这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。#include"bits/stdc++.h"usingnamespacestd;classA{public:A(){......
  • c++的链接器
    C++链接器是一个编译器工具,用于将编译器生成的目标文件(通常是对象文件)链接在一起,以生成可执行文件或共享库。在C++编程中,链接器负责解析函数和变量的引用,并将它们关联到正确的定义位置。链接器的主要任务包括:1.**符号解析**:解析目标文件中使用的函数和变量的符号引用。当编译器......
  • 【C++ leetcode】双指针问题
    1.  611.有效三角形的个数题目给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。题目链接.-力扣(LeetCode)画图和文字分析判断是否是三角形要得到三边,由于遍历三边要套三层循环,时间复杂度很大,所以这里我们需要借助双指针思想,可......
  • 【C++从0到1-黑马程序员】类和对象(一)
     C++从0到1-黑马程序员 课程学习笔记课程链接: 16类和对象-封装-属性和行为作为整体_哔哩哔哩_bilibiliC++面向对象三大特性封装继承多态C++认为万事万物皆为对象,对象有其属性和行为1.封装1.1.封装的意义(1)将属性和行为作为一个整体,表现生活中的事物类中的属......
  • C++11新特性
    1、成员变量默认初始化:构建一个类的对象不需要用构造函数初始化成员变量。2、auto关键字:用于定义变量,编译器可以自动判断的类型(前提:定义一个变量时对其进行初始化);3、智能指针;4、空指针:空指针从指向NULL变为指向nullptr;通过将指针初始化为nullptr(nullptr直接代表指针空值类型),可......
  • 复试C++19真题_看程序写结果_前置++运算符重载 易错
    考察前置++运算符设置为友元函数,这题的坑在于,返回值是不是对象的引用,形参也不是对象的引用,导致自增离开了作用域以后就不在有任何效果。#include<iostream>usingnamespacestd;classC{private:intxx,yy;public:C(intx,inty):xx(x),yy(y){}friendC......
  • QT 智能指针 QPointer QScopedPointer QSharedPointer QWeakPointer QSharedDataPoint
    QPointerQPointer是一种受保护的指针,当其引用的对象被销毁时,它会被自动清除(但是,销毁引用对象还是必须手动delete)。QPointer所指向的对象必须是QObject或其派生类对象。当多个指针指向同一个Object对象时,引用的对象可能被释放掉,这时使用QPointer就可以安全的测试引用对象是......