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

【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

文章目录 一、直接修改 和 间接修改 指针变量 的值 二、在函数中 间接修改 指针变量 的值 三、在函数中 间接修改 外部变量 的原理 一、直接修改 和 间接修改 指针变量 的值 ---- 直接修改 指针变量...的值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 将变量地址赋值给指针变量 , 或者使用 malloc 函数分配内存赋值给 指针变量 ; // 将变量地址赋值给一级指针 p...= &a; 间接修改 指针变量 的值 , 首先要 将 指针变量 的 地址值 , 赋值给 1 个 二级指针 变量 , 通过 * 符号 , 间接修改 一级指针变量的值 ; // 将一级指针的地址赋值给二级指针...p2 = &p; // 间接修改指针的值 *p2 = 12345678; 直接修改 和 间接修改 指针变量 的值 代码示例 : #include #include...return 0; } 执行结果 : 二、在函数中 间接修改 指针变量 的值 ---- 在 函数 中 间接修改 指针变量 的值 , 将 指向一级指针 的 二级指针 变量 , 传递到 函数形参 中 ,

21.4K11

我的C++奇迹之旅:内联函数和auto关键推导和指针空值

举个例子,当你在一个项目中,想要频繁调用一个Add函数 int Add(int x, int y) { return x + y; } 当你调用一千次,一万次,函数栈帧相应的要建立这么多次,对于代码空间和时间考虑...auto的使用细则 auto与指针和引用结合起来使用 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& int main() { int x...这是 C++ 语言的一个特性限制。 在 C++ 中,数组是一种特殊的数据结构,它的大小和元素类型在编译时就必须确定。而 auto 关键字是用来进行类型推导的,它无法推导出数组的大小和元素类型。...范围for的使用条件 for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围...} 因为 array 在这里是一个指针,而不是一个数组。

17910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】多态 ⑩ ( 不建议将所有函数都声明为 virtual 虚函数 | 多态的理解层次 | 父类指针和子类指针步长 )

    对象可以直接获取到自身封装的 普通函数 , 如果要访问虚函数 , 需要增加一次寻址操作 , 因此 这里建议不需要将有 多态 需求的函数声明为 虚函数 ; C++ 中 指向某类型对象的 指针 的 运算 ,...这里建议不需要将有 多态 需求的函数声明为 虚函数 ; 二、多态的理解层次 多态的理解层次 : 多态实现效果 : 相同的代码调用 , 有不同的表现形态 ; 父类指针 可 指向子类对象 , 使用父类指针...; 有 虚函数 的类 , 在 编译时 , 会生成 虚函数表 , 对应类中生成一个 vptr 指针指向 虚函数表 ; vptr 指针 是 与 对象绑定的 , 调用时 从 对象的 虚函数表 中查找虚函数...; 通过 父类指针 访问虚函数时 , 直接根据 实际对象 的 vptr 指针找该对象的 虚函数表 , 然后调用 虚函数表 中的 虚函数 ; 多态意义 : 多态是 设计模式 的基础 , 是 软件框架 的基础...; 三、父类指针和子类指针步长 指针数据类型 : C++ 中 指针 是 数据类型 的 一种 , 对 指针 进行 自增 ++ 或 自减 – 操作 , 指针的 地址值 是根据 指针类型 改变的 ; 指针运算

    30350

    静态变量 静态对象 静态函数和非静态函数的区别。(我的理解,大家看看对不对)

    4、静态函数,直接调用不需要实例化,也没有“属性” 没有实例化,函数是一份的,多少人调用,都是这一份。那么函数用的参数和返回值呢?也是只有一份吗?...这个好像就不是了,应该有多份,有一个调用的就产生一份,return 后自动销毁。我想应该是这样的,要不然多线程的时候不就乱了吗?...当然函数内定义的变量、对象也应该是独立的(多份),有一个调用的就产生一份。 小结 静态函数和非静态函数最大的区别是,静态的不能访问所在类的属性和内的私有变量,其他的好像都一样了。...再有就是在调用的时候会不会“复制”一遍算法(函数本身)?(我感觉是都不会复制的)。 两者需要的参数,返回值应该是独立的,一个调用者一份,一个调用者不会访问到其它调用者的参数和返回值。...不知道我的看法对不对,请大家检查一下。

    1.8K50

    浅谈动态类型领域中 Python 的变量、对象以及引用。

    00.写在之前 写这篇文章源自上次和一位读者的交流,在给他回答问题的时候我发现由于之前有学习 C 和 Java 这种静态编译类型语言的背景,使他在学习 Python 的时候还是会习惯用之前编程语言的思考去尝试理解...我们还是以 a = 1 为例,其实从上面的讲述中,我们很容易的可以发现对于 a = 1 这个赋值语句 Python 是如何去执行它的:创建一个代表值 1 的对象 --> 创建一个变量 a --> 将变量...下面我用一个图来更清晰的表示一下: ? 由上图我们可以看出,变量 a 其实变成了对象 1 的一个引用。如果你学过指针的话,你就会发现在内部「变量其实就是到对象内存空间的一个指针」。...02.写在之后 所以总结一下,具体怎么来说明 Python 中的变量、对象和引用: 变量是到内存空间的一个指针,也就是拥有指向对象连接的空间; 对象是一块内存,表示它们所代表的值; 引用就是自动形成的从变量到对象的指针...当然从技术的角度来讲对于上面的表述可能会存在一些问题,对象的结构绝不只是单纯的存值那么简单,但是对于刚入门来讲先这样理解就足够了,至于后续更深层次的探索等自己能力达到了可以尝试去接触。

    76220

    一起长锈:4 默认不可变的变量绑定与引用(从Java与C++转Rust之旅)

    “ “在 modify_value 函数中,x: &i32是函数的参数。“ ”其中 &i32 表示 x 是一个指向 i32 类型整数的不可变引用。...“这是Java设计的一个核心原则,就是要让我们这些普通的程序员少操心一些内存操作的复杂事,这样可以增加程序的安全性和可移植性。这也是我喜欢Java的主要原因哦。”...“所以,Java并没有提供我们通常理解的指针操作,而是让我们通过引用来访问和操作对象。” “这样做的好处是,Java的引用更安全。...学习难度 学习曲线较陡峭,需要理解所有权和借用规则。 相对简单,因为不需要管理内存和复杂的指针操作。 学习难度较高,需要理解指针、引用以及内存管理的复杂性。...多线程编程安全性 强类型系统和所有权规则使得多线程编程更安全。 线程安全主要依赖于同步机制和并发库。 需要使用特定的并发库和同步机制,以避免竞态条件和其他问题。

    23843

    类和对象:运算符重载

    在成员函数内部,this 指针允许你访问对象的成员变量和其它成员函数。全局函数没有 this 指针,因此无法访问特定对象的状态。 自赋值保护:成员函数版本的赋值运算符可以检查自赋值,即对象赋值给自己。...这可以通过比较 this 指针和传入的右值的地址来实现。全局函数没有 this 指针,因此无法进行这种检查。 语法要求:C++ 语法要求赋值运算符 = 必须是类的成员函数。...尝试将其定义为非成员函数会导致编译错误,因为编译器期望赋值运算符是类的成员。 语义问题:赋值运算符的语义是将一个对象的值设置为另一个对象的值。...这是为了保持语言的一致性和防止潜在的错误使用。 因此,当尝试将赋值运算符重载为全局函数时,编译器会报错,因为它违反了C++的规则和赋值运算符的预期行为。...d1 和 d2是作为this指针传递的,Print中的this指针是Date* this类型的,而d1是一个const Date*型的,所以无法传入d2进行调用函数。

    12310

    关于我、重生到500年前凭借C语言改变世界科技vlog.11——深入理解指针(1)

    1.内存和地址 内存是用于暂时存储 CPU(中央处理器)正在处理的数据以及与硬盘等外部存储设备交换的数据的硬件设备。...return 0; } pa 通过解引用找到 a 并将他的值改成 0 ,就好像通过门牌号找到特定酒店房间里的特定物品,并将其替换了,但这是就会产生一个疑惑,为什么不直接通过对 a 进行赋值改变它的值,...Debug 中使用的,在VS环境下的 Release 版本不影响用户使用 9.指针的应用 这里介绍两个概念:传值调用和传址调用 传值调用:当调用一个函数并传递参数时,实际传递给函数的是参数值的副本,也就是说...,函数内部对参数进行操作,不会影响到函数外部原来的变量值 传址调用:当调用一个函数并传递参数时,传递的是变量的地址(在一些语言中也可能表述为传递指向变量的指针等类似含义),这意味着函数内部通过该地址可以直接访问和操作函数外部的原始变量...,对参数的任何修改都会反映到原始变量上 具体实例理解可以参考“交换变量的多种方法(面试题)”这篇博客 传送门:交换变量的多种方法(面试题) 希望读者们多多三连支持 小编会继续更新 你们的鼓励就是我前进的动力

    7500

    RUST 语言特性之所有权

    其实在 Java 语言中,new 一个对象后得到的是一个指向对象的东西,本质上也是一个“指针”,但这个“指针”不可以随意修改,访问受到严格控制,和 C/C++ 语言中的指针有着本质的区别。...在我的理解中,所有权就相当于 C++ 中的智能指针,智能指针持有对象,智能指针结束生命周期,释放所持有的对象。...很明显,上面的代码存在问题: s1 和 s2 指向了同一个地址,当s2和s1离开自己的作用域时,它们会尝试去重复释放相同的内存。这就是 C++ 中经常碰到的的二次释放问题。...其实在 C++ 中,设计对象的深拷贝和浅拷贝同样存在考量。 所有权与函数 在 C++ 中,将指针问题复杂化的一个因素就是各种函数调用与返回,RUST 语言同样如此。...将值传递给函数在语义上类似于对变量进行赋值。将变量传递给函数将会触发移动或复制,就像是赋值语句一样。至于何时移动何时复制,和变量类型有关。下面的代码展示了变量在函数传递过程中作用域的变化。

    80260

    C++一分钟之-变量与数据类型入门

    每个变量都有一个特定的数据类型,这决定了变量能存储什么类型的数据以及占用多少内存空间。...类型不匹配:给变量赋值时类型不一致会导致编译错误或数据丢失。解决方案:确保赋值操作中的数据类型兼容。数据类型:信息的形态基本数据类型整型:如int、short、long long,用于存储整数。...理解它们对于高效内存管理至关重要。结构体与类结构体(struct)和类(class)允许创建复合数据类型,封装多个变量和函数。...通过理解基本类型、正确声明与初始化变量、选择合适的数据类型,以及熟悉高级数据结构,你将能够编写更高效、健壮的代码。记住,实践是学习的最好方式,不断编写代码并调试,逐步加深对这些基本概念的理解。...在遇到问题时,不要害怕查阅文档或向社区求助,每一次解决难题都是成长的阶梯。我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

    6810

    Go语言实战之数组的内部实现和基础功能

    关于上面这句话我个人理解: 数组结构上内存连续分配,所以很容易的计算索引(元素的相对地址),等差数列,同时内存连续,可以很好的使用CUP的缓存,当CPU访问首地址时,会自动的从内存中加载当前数组其他元素到...{10,12,13} 让 Go 自动计算声明数组的长度 array := [...]int{10, 20,30, 40, 50} 声明数组并指定特定元素的值,用具体值初始化索引为1和2的元素 array...var value int = array1[1][0] 在函数间传递数组 根据内存和性能来看,在函数间传递数组是一个开销很大的操作。...可以只传入指向数组的指针,这样只需要复制8字节的数据而不是8 MB 的内存数据到栈上 使用指针在函数间传递大数组 // 分配一个需要 8 MB 的数组 var array [1e6]int // 将数组的地址传递给函数...foo foo(&array) // 函数 foo 接受一个指向 100 万个整型值的数组的指针 func foo(array *[1e6]int) { ... } 将数组的地址传入函数,只需要在栈上分配

    52520

    深入理解C语言指针

    大家好,又见面了,我是你们的朋友全栈君。 一、指针的概念 要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。...x 和 y 在这里可以理解为具体的房间,房间 x 的门牌号(地址)是 px,房间 y 的门牌号(地址)是 py。...这里我主要还是用二维数组来举例,但是还是会给大家分析多维数组和指针的关系。...,那么我们现在可以尝试用指针数组的每个元素指向一个数组: //定义一个二维数组 int nums[2][2] = { {1, 2}, {2, 3} }; //此时 nums[0]、和 nums[1...函数指针定义如下: 数据类型 (*函数指针名)(); 函数指针在进行“*”操作时,可以理解为执行该函数。函数指针不同与数据指针,不能进行+整数操作。

    48420

    深入理解C语言指针

    x 和 y 在这里可以理解为具体的房间,房间 x 的门牌号(地址)是 px,房间 y 的门牌号(地址)是 py。...如果用前面的例子,可以理解为指针变量就是一张房卡,房卡存储了房间号的信息。 在我们定义一个变量的时候,要确定它的类型。...这里我主要还是用二维数组来举例,但是还是会给大家分析多维数组和指针的关系。...,那么我们现在可以尝试用指针数组的每个元素指向一个数组: //定义一个二维数组 int nums[2][2] = { {1, 2}, {2, 3} }; //此时 nums[0]、和...函数指针定义如下: 数据类型 (*函数指针名)(); 1 函数指针在进行“*”操作时,可以理解为执行该函数。函数指针不同与数据指针,不能进行+整数操作。

    1K00

    【C++篇】C++类与对象深度解析(三):类的默认成员函数讲解

    4.3 成员函数重载运算符 当运算符重载定义为类的成员函数时,第一个运算对象会隐式地传递给this指针,因此成员函数的参数数量比操作数少一个。....* 的行为在 C++ 语言中已经固定,主要用于通过对象访问其成员指针所指向的成员。 示例:尝试重载 ....5.1 赋值运算符重载必须定义为成员函数 赋值运算符重载是C++的一个特殊运算符重载,必须作为类的成员函数来定义。...this指针指向当前对象,other是被赋值的对象。 if (this != &other):检查当前对象是否与传入对象是同一个对象,如果是同一个对象,则跳过赋值操作,以避免自我赋值引起的问题。...总结 赋值运算符重载在管理动态资源、确保对象独立性以及支持链式赋值时非常有用。通过理解赋值运算符的特性和如何正确实现它,我们可以编写更健壮的C++程序,避免浅拷贝带来的问题。

    6400

    【linux学习指南】初识Linux进程信号与使用

    也就是取快递的⾏为并不是⼀定要⽴即执⾏,可以理解成“在合适的时候去取”。 在收到通知,再到你拿到快递期间,是有⼀个时间窗⼝的,在这段时间,你并没有拿到快递,但是你知道有⼀个快递已经来了。...我可能正在做优先级更⾼的事情,不会⽴即处理?什么时候?合适的时候。 信号到来|信号保存 |信号处理 怎么进⾏信号处理啊?a.默认b.忽略c.⾃定义,后续都叫做信号捕捉。...进程就是你, 操作系统就是快递员,信号就是快递,发信号的过程就类似给你打电 注意: 要注意的是,signal函数仅仅是设置了特定信号的捕捉⾏为处理⽅式,并不是直接调⽤处理动作。...如果后续特定信号没有产⽣,设置的捕捉函数永远也不会被调⽤!! Ctrl-C 产⽣的信号只能发给前台进程。...其实SIG_DFL和SIG_IGN就是把0,1强转为函数指针类型 总结

    7610

    计算机小白的成长历程——函数(1)

    它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 2.一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。...相比于其它的代码,它是相对独立的,这里我理解的是我需要使用它的时候,它才能起作用,我不需要使用它的时候,它也能存在于咱们的代码里这里我举个例子来证明一下: 大家可以看到,在这个代码中,我们编写了一个求两数之和的函数...自定义函数与库函数相同的地方就是它们都有函数名、返回值类型和函数参数; 它们的区别我们可以简单的理解为就是一个已经被定义好而且被收录在C语言库中,一个是由程序员根据实际情况进行设计且未被收入到C语言库中...,下面我们接着看下一个例子; (2)写一个函数可以交换两个整型变量的内容: 这个内容我们之前也接触过很多次了,前面我们都是直接在主函数中完成交换内容的,那么今天我们来尝试一下通过自定义函数来完成交换内容...b); return 0; } 这里我们可以看到,在函数swap2中我们的参数类型是指针类型,接收的是地址,也就是此时的x、y的地址与a和b的地址一致,紧接着我们在函数体内通过解引用操作符将a和b的值分别取出来赋值给变量

    38230

    【c语言】指针就该这么学(1)

    希望通过我的讲解,能够加深你对指针的理解。...这里要注意:解引用操作符的 * 和定义指针变量时的 * 是不一样的,定义变量时 * 只是表示它是一个指针变量。...让我们看看运行结果: a和b的值并没有交换过来。为什么呢?还记得函数传参的本质吗?函数传参时,形参只是实参的一份临时拷贝,你在函数内改变形参是无法影响到实参的。...我们都知道,数组在内存中是连续存放的,那么我们就可以利用指针跳过特定字节的特性,来访问数组当中的每一个元素。...3.3 避免函数返回局部变量的地址 我们在定义一个函数的时候,要避免返回局部变量的地址,这样就不会在外部函数中出现使用野指针的情况。

    14610

    【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解

    整体思路 在案例中我使用c语言编写了一个简单的四层二叉树进行 GDB 调试练习。这个程序故意在后面引发了一个段错误,导致程序崩溃。文章将使用 GDB 来诊断这个问题。 2....GDB调试四层二叉树 3.1 测试程序分析 测试程序是一个简单的打印四层二叉树的c语言程序。 对于树TreeNode结构体和创建树节点createNode函数属于常规操作【不做分析】。...print root print root和p root等价 这会打印 root 变量的值,即指向树根节点的指针。在这里,我们期望 root 指向一个已经创建好的二叉树的根节点。...具体地,这行代码尝试将值 10 写入指针 ptr 所指向的内存地址,但是 ptr 指向了一个空地址,因此导致了段错误。 现在我们需要进一步分析,为什么会发生段错误。可以使用以下几种方法: a....x ptr 输出表示 GDB 尝试查看指针 ptr 所指向的内存地址上的内容时出现了问题: 0x0: 表示要查看的内存地址为 0x0。

    12410

    呜呜呜我要拿Go赢他~ 入门,基础语法Type 、interface、struct、*指针接收器

    • 别名,除了换了一个名字,没有任何区别 结构体初始化 • Go 没有构造函数!!!...• 初始化语法:Struct{} • 获取指针: &Struct{} • 获取指针2:new(Struct) • new 可以理解为 Go 会为你的变量分配内存,并且把内存都置为0 package main...%s,%d一只\n", t.Color, t.Price) } 没啥特别的了其他的和 Java 差不多学会一门其他的得心应手 指针与方法接收器 指针 • 和 C,C++ 一样,*表示指针,&取地址 •...如果声明了一个指针,但是没有赋值,那么它是 nil 结构体自引用 • 结构体内部引用自己,只能使用指针 • 准确来说,在整个引用链上,如果构成循环,那就只能用指针 必须使用指针 方法接收器 结构体接收器内部永远不要修改字段...大家点赞支持一下哟~ 我正在参与

    25821
    领券