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

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

文章目录 一、直接修改 和 间接修改 指针变量 的值 二、在函数中 间接修改 指针变量 的值 三、在函数中 间接修改 外部变量 的原理 一、直接修改 和 间接修改 指针变量 的值 ---- 直接修改 指针变量...return 0; } 执行结果 : 二、在函数中 间接修改 指针变量 的值 ---- 在 函数 中 间接修改 指针变量 的值 , 将 指向一级指针 的 二级指针 变量 , 传递到 函数形参 中 ,...在 函数中 , 使用 * 符号 , 修改 二级指针 指向的 一级指针 的变量值 ; 注意 : 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针 的 二级指针 变量 才可以 , 传入一级指针变量...n", p); // 在函数中 , 简介修改指针的值 modify_pointer(p2); // 打印一级指针地址 printf("%d\n", p);...三、在函数中 间接修改 外部变量 的原理 ---- 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针 的 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为

21.4K11

Redis 之后,Python 的 master-slave 亦恐被无奈修改

,所以出现了很多呼吁修改的声音。...等到 Python 3.8 发布时,相信像这些被认为具有“侵犯性”的术语将会减少。 事实上,在技术圈子里,这种关于政治正确的事屡见不鲜。...而在 2014 年,Drupal 在经过一番论证之后,将 "master" 和 "slave" 这两个词换成了 "primary" 和 "replica"。...他在评论中写道:“如果一个特定的段落表述不清楚或令人反感,这确实应该被修改;否则,我们不应该让含糊不清的政治正确观念影响其他明确的常见英语用法。...他在评论中写到:“我正在关闭这些 PR,Victor 的 PR 中有四分之三已被合并。但第四个不应被合并,因为它是对 UNIX ptys 底层术语的反映。

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

    C语言函数传递了指针,值没有被修改的原因及解决方法

    C语言函数指针参数值为什么不变C语言函数中传递了指针作为参数,确切来说是传递了指向变量的内存地址作为参数,可经过函数内的修改之后,该指针指向的变量的值为什么不会被修改?...实例代码该实例输出了三个变量的内存地址,前两个是一样的,即通过*x++的运算,变量指向的内存地址并没有发生改变,但是如果是通过指针的自增运算,比如z++,则内存地址会发生改变。...printf("%x\n",&y); test(&y); printf("%x\n",&y); int *z = &y; z++; printf("%x\n",z);}//编译运行之后得到输出...(不同的平台和编译器可能得到不一样的输出):61fe1461fe1461fe18解决方法将x++修改为:x = *x + 1;原文:C语言函数传递了指针,值为什么没有被修改免责声明:内容仅供参考,不保证正确性

    43021

    【c++】vector模拟实现与深度剖析

    因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃,即如果继续使用已经失效的迭代器,程序可能会崩溃 扩容后,我原先pos指向的位置被释放...如果容器在插入新元素前还有足够的capacity(未使用的预留空间),一般来说,除了指向插入点之后元素的迭代器之外,其他的迭代器、指针和引用会保持有效。...删除容器中的元素(例如通过erase、pop_back等)会使所有指向被删除元素以及之后元素的迭代器、指针和引用失效。...所以代码中重新计算了pos的值来防止迭代器失效 要安全地使用迭代器,最好的实践是避免在迭代过程中修改容器的大小和结构,或者如果确实需要修改,则应在每次修改后重新获取迭代器 erase() 注意!...由于元素已经被移动了,这个位置现在包含了前一个被删除元素位置之后的元素。

    10610

    【C++STL】vector(常见接口、模拟实现、迭代器失效)

    因此迭代器失效,实际就是迭代器底层对应指针所指向的 空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。...迭代器失效解决办法:在使用前,对迭代器重新赋值即可。 插入发生错误的本质是迭代器失效,因为此时pos还指向旧空间,而旧空间已经被释放了。...erase删除pos位置元素后,pos位置之后的元素会往前搬移,如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。...上图是修改后的代码。模拟实现的erase也要跟着修改 ,要有返回值,如下图: 使用memcpy拷贝问题 当不需要扩容时,可以正常运行。 如果扩容了,程序就崩了。...接着delete时,会调用析构函数,此时string就没了,start指向的空间也被销毁了。再让start指向tmp的空间,而tmp空间里的string是浅拷贝,在刚才就没了。

    14710

    C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧

    iterator _finish;: 这个成员变量保存了一个指向容器中最后一个元素之后的位置的指针。...使用常量引用可以避免在函数内部修改传入的值,并且通常比传值的方式更加高效,因为避免了不必要的复制操作。 value 是参数的名字,它代表了要初始化 vector 中每个元素的值。...因为这个函数只是交换内部指针,v 被声明为 const 是为了表明不会修改 v 的逻辑内容(但实际上会修改 v 的内部指针)。 std::swap 是标准库中的模板函数,交换两个变量的值。...影响: 内存重新分配会导致所有原有的指针和迭代器失效,因为 vector 内部的元素被移动到新的内存位置。 在内存重新分配后,原来的迭代器和指针将不再有效,因为它们指向的是旧的内存区域。...删除一个元素,迭代器还指向原位置,但元素被移动了,也就是原位置的后一个元素来到原位置,因此注意 erase 后,pos 之后的迭代器要更新指向新位置。

    17410

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

    拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝)。...,NodePtr类通过重载-> 和 * 运算符实现如同裸指针一样的操作,如 np->Calc(); 程序中通过智能指针对象的一次拷贝构造和赋值操作之后,现在共有3个局部智能指针对象,但np 和 np2...的时候就出错了,查看push_back 的声明: void push_back(const _Ty& _Val); 即参数是const 引用,在函数内部拷贝时不能对右操作数进行更改,与第3点冲突,所以编译出错...new 分配指针本身的内存,如果此时内存耗尽,operator new 失败,push_back 抛出异常,此时裸指针既没有被智能指针接管,也 没有插入vector(不能在类的析构函数中遍历vector...此外,在Ptr_vector 类中还重载了push_back,能够直接将智能指针作为参数传递,在内部插入裸指针成功后,释放所有权。

    69410

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

    拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝)。...从输出可以看出,通过NodePtr 智能指针对象包装了裸指针,NodePtr类通过重载-> 和 * 运算符实现如同裸指针一样的操作,如 np->Calc();  程序中通过智能指针对象的一次拷贝构造和赋值操作之后...的时候就出错了,查看push_back 的声明: void push_back(const _Ty& _Val); 即参数是const 引用,在函数内部拷贝时不能对右操作数进行更改,与第3点冲突,... new 分配指针本身的内存,如果此时内存耗尽,operator new 失败,push_back 抛出异常,此时裸指针既没有被智能指针接管,也 没有插入vector(不能在类的析构函数中遍历vector...此外,在Ptr_vector 类中还重载了push_back,能够直接将智能指针作为参数传递,在内部插入裸指针成功后,释放所有权。

    1.8K00

    初识C++ · 模拟实现vector

    finish; } ~vector() { delete[] _start; _start = _finish = _end_of_storage = nullptr; } 因为是[]重载,返回的是可以修改的类型所以用引用...,因为删除一段区间的原理是一样的,因为是任意位置删除和插入,所以实现了之后在push_back和pop_back上也可以复用 insert实现的原理很简单,挪动数据添加数据即可,当然要注意是否要扩容:...,就会存在访问出错的问题,这一切都是因为memcpy,也就是在扩容,尾插的时候会涉及到的问题。...我们了解memcpy的底层之后,就知道memcpy拷贝的方式是逐字节的拷贝,所以当_start指向的空间是自定义类型的时候,经过扩容之后,就会导致_start指向的空间被销毁,但是拷贝过来的指针依旧是指向那块被销毁的空间的...因为删除之后会有移动数据的发生,比如1223,删除了第一个2,第二个2往前面移动,然后再pos位置的指针往后移动,就相当于it指针移动了两次,所以会错过,那么如果最后一个是偶数,即11252,就会完美错过

    7010

    C++效率掌握之STL库:vector底层剖析

    ,_finish 是有效字节的尾指针,_end_of_storage 是容量的尾指针,实现基本的构造、析构、拷贝,注意都是 iterator 类型,为了方便配合迭代器使用 3.vector类对象的遍历...当一个对象被声明为 const 时,只能调用该对象的 const 成员函数。...对象访问其元素 虽然理论上仅提供 const 版本的 [] 运算符是可行的,但在实际编程中这样做会有诸多局限性,const 版本的 [] 运算符返回的是 const 引用,这意味着通过该运算符获取的元素不能被修改...在很多场景下,我们需要对容器中的元素进行修改操作,如果只有 const 版本的 [] 运算符,就无法实现这一功能 7.使用memcpy拷贝问题 int main() { bite::vector之后原来的空间就被释放了,内置类型就没事,自定义类型会出问题---- 希望读者们多多三连支持 小编会继续更新 你们的鼓励就是我前进的动力!

    16510

    【c++丨STL】vector模拟实现

    (n); for (size_t i = 0; i < n; i++) { push_back(val); } } 不难发现,由于我们在成员变量声明时已经赋初值,所以无参构造中什么都不用做。...push_back、reverse等函数我们之后实现。这里特别注意一下n个val值构造函数,如果我们不传val参数,则会调用T类型的默认构造函数,生成一个匿名对象并赋值给val。...简单的讲,由于vector是使用三个迭代器来维护的,那么如果它们指向的空间被释放,那么就会出现野指针的情况,这三个迭代器的相关操作就是无效的,这就是迭代器失效。...解决办法: 记录迭代器pos与start的相对距离,当增容完成之后,根据相对距离更新pos即可。 为什么string在进行插入的时候不会发生迭代器失效呢?...之后博主会带领大家学习一个新容器--list。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

    9010

    【C++11】万能引用与完美转发

    但是,大家看到我们这里接收t之后又往下传了一层 那大家就要思考一下在PerfectForward函数内部t又往下传给了Fun,那传给Fun的话t会匹配什么呢?...所以,一个右值被右值引用后属性会变成左值 那想一想其实这样设计也是合理的: 比如这个场景 转移资源也可以认为是修改它了,而临时变量或匿名对象这样将亡值是不能修改的。...右值被右值引用后就变成了左值。...在第一次传递给push_back 的参数,右值的话就调用右值引用版本的push_back ,但是push_back里面调用insert第二次传递,就变成左值了 所以最终不论是右值还是左值的push_back...// 2、迭代器要么就是自定义类型对原生指针的封装,模拟指针的行为 template struct __list_iterator

    21210

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)

    拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝)。...从输出可以看出,通过NodePtr 智能指针对象包装了裸指针,NodePtr类通过重载-> 和 * 运算符实现如同裸指针一样的操作,如 np->Calc(); 程序中通过智能指针对象的一次拷贝构造和赋值操作之后...的时候就出错了,查看push_back 的声明: void push_back(const _Ty& _Val); 即参数是const 引用,在函数内部拷贝时不能对右操作数进行更改,与第3点冲突,所以编译出错...new 分配指针本身的内存,如果此时内存耗尽,operator new 失败,push_back 抛出异常,此时裸指针既没有被智能指针接管,也 没有插入vector(不能在类的析构函数中遍历vector...此外,在Ptr_vector 类中还重载了push_back,能够直接将智能指针作为参数传递,在内部插入裸指针成功后,释放所有权。

    1.2K20

    C++ —— vector 的模拟实现

    核心接口 3.1 reserve //修改之后 //扩容 void reserve(size_t n) { if (n > capacity()) { //提前将旧size赋给新size size_t...pos位置就会失效,也就是迭代器失效,就相当于成为了野指针,解决方法是将扩容之前的位置记录下来在扩容后更新pos的位置 //在指定位置插入数据 void insert(iterator pos, const...使用memcpy拷贝问题 memcpy拷贝问题的问题其实就是浅拷贝的原因 浅拷贝就是两个指针指向同一块空间,如果一个指针对该空间进行释放或者其他操作就会影响另一个指针导致内存泄漏等问题 所以最好使用深拷贝让两指针指向不同的空间然后使其数据保持一致...再把三个私有变量指向新空间 _start = tmp; _finish = tmp + old_size; _end_of_storage = tmp + n; } } 修改之后...//修改之后 //扩容 void reserve(size_t n) { if (n > capacity()) { //提前将旧size赋给新size size_t old_size =

    7000

    【C++】vector的模拟实现(SGI版本)

    = v.end()) { v.insert(it, 30); } //insert以后,it不能继续使用,因为迭代器可能失效(野指针),虽然在insert内解决了迭代器失效的问题,但那只是修改了内部的...(*it)++;//这里一定是一个野指针,因为发生了异地扩容,it指向的是旧空间的位置,但野指针的访问并没有被编译器报错,这很危险。...//所以一定要小心对于野指针的使用,如果it指向的旧空间被分配给某些十分关键的金融数据,则野指针访问会修改这些关键数据,非常危险 //如果野指针的使用影响到其他的进程就完蛋了,公司里出现这样的问题直接废球了...//因为在erase之后我们统一认为迭代器it失效了,所以需要erase的返回值来更新迭代器,代码在VS和g++下面都可以跑。...tmp对象时,会调用析构函数将指针所指空间销毁,这样一来*this对应的数组里面的每个vector对象的所有指针就都会变为野指针,此时push_back就会对野指针进行访问,自然程序会报错

    56930

    【C++】STL——vector

    resize 在开空间的同时还会进行初始化,影响 size。...2.3vector增删查改 2.4vector迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对 指针进行了封装 ,比如: vector 的迭代器就是原生态指针...因此 迭代器失效,实际就是迭代器 底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间 ,造成的后果是程序崩溃 ( 即 如果继续使用已经失效的迭代器,程序可能会崩溃 ) 。...解决方式:在以上操作完成之后,如果想要继续通过迭代器操作 vector 中的元素,只需给 it 重新赋值即可。 */ while ( it !...迭代器失效解决办法:在使用前,对迭代器重新赋值即可。

    7410

    深入浅出list容器

    首元素前插入值为val的元素 pop_front() 删除list中第一个元素 push_back(val) 在list尾部插入值为val的元素 pop_back() 删除list中最后一个元素 insert...这些参数允许用户根据需要定制迭代器的行为,例如是否允许修改数据(通过 Ref)或者返回常量或非常量指针(通过 Ptr),由此可以实例化出list_iterator和const_list_iterator...按需实例化 模板类或函数在实际使用时才被编译器实例化。这意味着只有当用户显式地创建一个特定类型的模板实例时,编译器才会生成相应的代码。...emplace_back与push_back emplace_back 和 push_back 都是 C++ STL 容器(如 vector、deque、list 等)中用来在容器的末尾添加元素的方法...emplace_back 通常在需要构造复杂类型或避免不必要的复制和移动操作时更优,而 push_back 在添加简单类型或已经存在的元素时更为方便。 通过重载再次理解->与.

    8310
    领券