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

【C 语言】多级指针 ( 函数中生成 二级指针 | 通过传入 三级指针 进行间接赋值 )

文章目录 前言 一、函数中生成 二级指针 ( 通过传入 三级指针 进行间接赋值 ) 二、完整代码示例 前言 如果要 通过 函数形参 间接赋值 修改 n 级指针, 需要向函数中传入 n + 1...级指针 形参 ; 一、函数中生成 二级指针 ( 通过传入 三级指针 进行间接赋值 ) ---- 通过 函数 形参变量 , 间接赋值 返回 生成 二级指针 函数 ; 如果要生成一个 二级指针 ,...必须传入 三级指针 , 才能修改 该 二级指针 ; 注意 : 传入 三级指针 , 不要直接修改该值 , 先创建一个临时 局部二级指针变量 , 将 二级指针 生成完毕后 , 最后再 三级指针 指向地址...== NULL) { return -1; } // 遍历 二维指针 指向多个 一维指针 // 并为每个 一维指针 堆内存中 分配 20 字节内存...指向多个 一维指针 // 并为每个 一维指针 堆内存中 分配 20 字节内存 for(i = 0; i < num; i++) { // 为每个字符分配 20

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

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

文章目录 一、直接修改 和 间接修改 指针变量 值 二、函数中 间接修改 指针变量 值 三、函数中 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 值 ---- 直接修改 指针变量...值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 将变量地址赋值指针变量 , 或者使用 malloc 函数分配内存赋值 指针变量 ; // 将变量地址赋值一级指针 p...= &a; 间接修改 指针变量 值 , 首先要 将 指针变量 地址值 , 赋值 1 个 二级指针 变量 , 通过 * 符号 , 间接修改 一级指针变量值 ; // 将一级指针地址赋值二级指针...return 0; } 执行结果 : 二、函数中 间接修改 指针变量 值 ---- 函数 中 间接修改 指针变量 值 , 将 指向一级指针 二级指针 变量 , 传递到 函数形参 中 ,... 函数中 , 使用 * 符号 , 修改 二级指针 指向 一级指针 变量值 ; 注意 : 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量

20.9K10

C++ this指针:用于成员函数中指向调用该函数对象

C++中this指针是一个指向当前对象指针成员函数中,可以使用this指针来访问调用该函数对象成员变量和成员函数。...一、定义和使用this指针 this指针成员函数内部定义一个常量指针。它存储了当前对象地址,可以通过它访问当前对象成员变量和成员函数。...成员函数内,无需显式地传入this指针,编译器会自动将当前对象地址赋this指针。...getName函数内部,使用了this指针访问调用该函数对象成员变量name。...四、总结 this指针C++中是一个非常重要概念,可以用来访问调用该函数对象,作为返回值返回,或者作为函数参数传递。掌握this指针使用可以帮助我们更好地编写面向对象程序。

19540

C++ 动态内存

c++内存上我碰到很多很多坑~,特此来记一笔。...局部static对象只第一次使用前进行分配,程序结束时销毁。 但是除了自动和static对象之外,C++还支持动态分配对象。...虽然不能进行拷贝或者是赋值操作,但是可以通过调用release或reset将指针所有权从一个非const unique_ptr转移到另一个unique_ptr ?...调用release会切断unique_ptr和它原来管理对象联系。release返回指针通常被用来初始化另一个智能指针另一个智能指针赋值。...我们传递给delete指针必须是指向动态分配内存。或者是一个空指针,释放一块并非new分配内存或者是相同指针被释放多次,其行为都是未定义

80220

C++】智能指针详解

C++中,动态内存管理是用一对运算符完成:new和delete,new:动态内存中为对象分配一块空间并返回一个指向该对象指针,delete:指向一个动态独享指针,销毁对象,并释放与之关联内存...auto r = make_shared(42);//r指向int只有一个引用者 r=q;//r赋值,令它指向另一个地址 //递增q指向对象引用计数 //递减r原来指向对象引用计数...释放一块并非new分配内存或者将相同指针释放多次,其行为未定义。即使delete后面跟是指向静态分配对象或者已经释放空间,编译还是能够通过,实际上是错误。...下表是unique操作: 虽然我们不能拷贝或者赋值unique_ptr,但是可以通过调用release或reset将指针所有权从一个(非const)unique_ptr转移另一个unique...调用release会切断unique_ptr和它原来管理对象间联系。release返回指针通常被用来初始化另一个智能指针另一个智能指针赋值

75830

【笔记】《Effective C++》条款1-25

, 否则声明为explict C++有大量未定义(undefined)行为, 一定要小心....8 别让异常逃离析构函数 由于C++中两个异常同时存在会导致未定义行为, 因此我们不应该让析构函数上报异常, 这是因为析构函数是会被自动调用, 当一个对象析构而抛出异常时, 同个作用域其它对象析构也会被自动执行..., 同时日常中通过重载调用运算来模拟指针方便开发 隐式类型转换可以写, 比较自然, 但是有时有危险 更常见情景是写一个显式get函数来获取原始指针 牢记RAII类不是为了封装数据存在, 而是为了原始指针加上资源回收功能..., 所以不必RAII类加太多功能 16 成对使用new和delete时要采取相同形式 由于下图内存排列特性, 不要混淆不同new和delete, 否则容易引发未定义行为. delete[]会对内存最前面进行大小读取...一旦这里调用函数时候跳出异常, 那么new返回值无法交给构造函数, 就无法delete从而产生很奇怪内存泄露 由于编译器对跨语句调用顺序没有排列自由, 因此一定要记得独立语句中将new置入智能指针

99030

深拷贝与浅拷贝

这意味着如果源对象或目标对象修改了共享内存中数据,那么另一个对象也会受到影响。这可能导致意外行为和错误结果。...C++中,如果没有特别指定拷贝构造函数赋值运算符,编译器会默认执行浅拷贝。但是如果你类包含了如指针等需要手动管理内存数据类型,那么就需要自行实现深拷贝,以避免可能内存泄露或者未定义行为。...这种情况下,当其中一个对象被析构并释放了内存后,另一个对象成员指针就会成为悬空指针,指向已释放内存。使用悬空指针可能导致程序出错、崩溃或产生不可预测行为。...为了避免这种情况,需要实现深拷贝,确保每个对象都有自己独立内存副本。 代码示例 浅拷贝 MyClass类中,使用了默认移动构造函数、复制构造函数、移动赋值函数和复制赋值函数。...赋值运算符重载函数MyClass &MyClass::operator=(const MyClass &other)中,首先删除了this->data指针当前指向内存,然后创建了一个新int类型指针

11210

c++深拷贝和浅拷贝

C++中类拷贝有两种:深拷贝,浅拷贝:当出现类等号赋值时,即会调用拷贝函数 一:两个区别 1 未定义显示拷贝构造函数情况下,系统会调用默认拷贝函数——即浅拷贝,它能够完成成员一一复制。...当数据成员中没有指针时,浅拷贝是可行;但当数据成员中有指针时,如果采用简单浅拷贝,则两类中两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象,所以,此时,必须采用深拷贝...二 带实例解释 c++默认拷贝构造函数是浅拷贝 浅拷贝就是对象数据成员之间简单赋值,如你设计了一个没有类而没有提供它复制构造函数,当用该类一个对象去令一个对象赋值时所执行过程就是浅拷贝...= a会造成未定义行为,因为类A中复制构造函数是编译器生成,所以b = a执行是一个浅拷贝过程。...所以这里就需要深拷贝来解决这个问题,深拷贝指就是当拷贝对象中有对其他资源(如堆、文件、系统等)引用时(引用可以是指针或引用)时,对象另开辟一块新资源,而不再对拷贝对象中有对其他资源引用指针或引用进行单纯赋值

41810

C++编程经验(7):delete之后到底要不要置空?

很不幸是,对于这种逻辑错误开发者往往没有特别好手段可以规避掉,二次delete一个悬垂指针行为未定义,也就是说错误是有可能被隐藏。...先来理一下nullptr和野指针/悬垂指针区别: 解引用: nullptr:未定义指针/悬垂指针未定义 delete nullptr:良好定义,delete什么也不用做 野指针/悬垂指针未定义...另一方面,你不能通过一次试结果得出结论。因为那只能说明特定编译器、特定crt下结果。原理上你得知道delete是不改变指针。所以第二次delete时候,行为未定义,什么事情都可能发生。...类似的还有为了防止 double free 而在 free 之后赋值 NULL,一样是错误 C++ 里,任何资源释放操作都应该在析构函数里进行,这样只要管好对象生命期就不会有资源泄漏了。...---- 又有反方大佬出场: delete 后置为 nullptr C++ 中一般是不必要,因为 C++ 可以用 RAII 来管理内存,而析构函数是被编译器保证只执行一次

2.2K20

C++智能指针详解(共享指针,唯一指针,自动指针

return uq; //将uq关联对象所有权转移调用函数 } uq = source(); 要将新值赋唯一指针,该新值必须是唯一指针 函数可以作为数据接收端,也可以作为数据发送源 return...(ac, …) 使用分配器ac为由传递参数初始化新对象创建共享指针 sp.get() 返回存储指针(通常是拥有对象地址,如果没有则返回nullptr) *sp 返回拥有的对象(如果没有则为未定义行为...) sp->… 提供对拥有对象成员访问权限(如果没有,则行为未定义) sp.use_count() 返回共享所有者(包括sp)数目;如果共享指针为空,则返回0 sp.unique() 返回sp是否是唯一所有者...() 返回存储指针(拥有的对象地址;如果没有,则返回nullptr) *up 仅单个对象;返回拥有的对象(如果没有,则为未定义行为) up->… 仅单个对象;提供拥有对象成员访问权限(如果没有,...则为未定义行为) up[idx] 仅数组对象;返回具有存储数组索引idx元素(如果没有,则为未定义行为) up.get_deleter() 返回删除器引用

1.5K20

《C++Primer》第十二章 动态内存

首先你只有确定代码不会delete指针情况下才能使用get;另外不要用get初始化另一个智能指针或者为另一个智能指针赋值。...// 这段代码抛出来一个异常,且f中未被捕获 } // 函数结束时shared_ptr自动释放内存 2.5 智能指针和哑类 包括所有标准库在内很多C++类都定义了析构函数负责清理对象使用资源...需要注意是调用release会切断unique_ptr和它元拿来管理对象之间联系。release返回指针通常被用来初始化另一个智能指针另一个智能指针赋值。...如果我们delete一个指向数组指针时忽略了方括号,或者delete一个指向单一对象指针时使用了方括号,其行为未定义。 3....,使用未构造内存,其行为未定义

1.3K10

C语言中迷途指针

一、何为迷途指针。 迷途指针,顾名思义就是迷路指针,当然开个玩笑,其实也就是如果内存已经释放(如用free函数),但是指针却在继续引用原始内存,像这样指针,我们就称为迷途指针。...p值为1000,当调用函数free释放这段内存时,指针变量p值任然是1000,虽然这段内存已被释放,但这段内存中任然可能包含原值,但此生指针p已指向不是一个有效对象,因为这段内存可能会被重新利用...,里面的数据也是不确定,由于大部分运行时系统不会阻止对后续访问与修改,所以如果我们试图解引一个已释放指针,其行为未定义,那么将可能引起很多问题,如:如果再次访问这段内存,其行为是不可预期、潜在安全隐患...小编大家推荐一个学习氛围超好地方,C/C++交流企鹅裙:870963251!适合在校大学生,小白,想转行,想通过这个找工作加入。...要是后面再次使用此指针会中指程序。注意赋值只会影响被赋值指针。多指针的话还会有问题。 2、用第三方工具检查迷途指针。 3、自己写一个函数代替free函数

97640

你该知道C++四种显式类型转换

C++ 四种强制类型转换。 当然,C++也是支持C风格强制转换,但是C风格强制转换可能带来一些隐患,让一些问题难以察觉.所以C++提供了一组可以用在不同场合强制转换函数。...; return 0; } 未定义行为:C++标准对此类行为没有做出明确规定.同一份代码使用不同编译器会有不同效果. vs2017 下,,虽然代码中 c_val , use_val ,...每次不一定一样 Base->Sub I'm Base sub> base2sub val is: 00000000 // VS2017C++编译器,对此类错误转换赋值为nullptr...这个检查主要来自虚函数(virtual function) C++面对对象思想中,虚函数起到了很关键作用,当一个类中拥有至少一个虚函数,那么编译器就会构建出一个虚函数表(virtual method...a pointer to a function of a different type (从指向函数指针转向另一个不同类型指向函数指针) A pointer to an object to a

1.8K20

C++关键知识点梳理

基本类型基本类型大小随编译器决定,下面以32位为例类型大小 (字节)bool未定义char1short2int4long4long long8float4double8变量变量初始化,C++中,使用未初始化变量是一种错误编程行为...类是C++实现面向对象编程三大特征:继承、封装、动态方式之一;类具备构造函数和析构函数。类构造函数/默认构造函数:控制对象初始化过程,成员初始化顺序与它们类定义中出现顺序一致。...,否则编译器不知道该分配多少内存数据成员。...但是针对某些情况,例如两个类互相依赖或者类成员包含本身,这就需要使用类指针或引用,对于未定义只声明使用前需要向程序中引入前向声明。...智能指针使用陷进同一内置指针值不能初始化多个智能指针,避免资源被多次释放智能指针get()返回内置指针不能初始化或者reset另一个智能指针,也不允许手动delete get()返回内置指针使用get

93230

百度不问我项目,全程基础拷打,真扎心!

这是因为使用delete操作符释放一个指向派生类对象基类指针时,如果基类析构函数不是虚函数,那么只会调用基类析构函数,而不会调用派生类析构函数,这样就会导致内存泄漏和未定义行为问题。...通过将析构函数定义为虚函数,可以确保释放派生类对象时,先调用派生类析构函数,再调用基类析构函数,从而避免内存泄漏和未定义行为问题。...智能指针 智能指针C++一种特殊指针,它是一个对象,用来管理另一个指针所指向对象生命周期。智能指针可以自动地分配和释放内存,避免手动管理内存麻烦和出错风险。...class中缺省函数 没关注 补充: C++中,如果一个类没有显式地定义「构造函数、析构函数、拷贝构造函数赋值运算符重载函数」,那么编译器会自动生成这些函数,这些函数被称为缺省函数。...多线程编程中,如果多个线程同时访问同一个共享资源,可能会发生竞态条件(Race Condition),导致程序行为出现未定义情况。为了避免这种情况发生,可以使用多线程锁来保护共享资源。

21110

第4章 | 移动

所以程序最终状态如图 4-6 所示。 图 4-6: Python 中将 s 赋值 t 和 u 结果 Python 已经将指针从 s 复制到 t 和 u,并将此列表引用计数更新为 3。... C++ 中,把 std::vector 赋值其他元素会生成一个向量副本,std::string 行为也类似。...图 4-8: C++ 中将 s 赋值 t 和 u 结果 理论上,如果涉及某些特定值,那么 C++赋值可能会消耗超乎想象内存和处理器时间。...虽然 C++ 允许重载赋值运算符以及定义专门复制构造函数和移动构造函数,但 Rust 并不允许这种自定义行为 Rust 中,每次移动都是字节级一对一浅拷贝,并让源变成未初始化状态。...例如,本章前半部分展示过 C++ 中将一个变量赋值另一个变量时可能需要任意数量内存和处理器时间。Rust 一个原则是:各种开销对程序员来说应该是显而易见

5410

C++ 深入理解const_cast转换运算符

,这种行为C++语法中是未定义行为,但实际上是确实可以运行。...也正是由于该行为未定义行为,才导致输出结果与我们预期不一致。...调用第三方函数使用 const_cast另外一种使用场景就是:使用第三方库或API时,它们只提供了非const类型参数函数,但我们只有const类型对象。如示例2所示。...2中,我们使用第三方库和API时候,我们只能调用,看不到其具体实现,为了能够调用成功,需要使用const_cast来去除*ptrconst属性,来保证函数正常调用,但是需要保证*ptr指向对象初始化时候是非...const_cast去除volatile属性 const_cast另一个作用就是:const_cast可以用于丢弃volatile属性。

68010

【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针

foo函数中,如果入参n > 5, 则会导致指针ptr内存未被正确释放,从而导致内存泄漏。...bar函数中,我们将指针ptr传递给了另外一个函数other_fn,我们无法确定other_fn有没有释放ptr内存,如果被释放了,那ptr将成为一个悬空指针,bar在后续还继续访问它,会引发未定义行为...当尝试把一个unique_ptr直接赋值另外一个unique_ptr会编译报错。...当一个新shared_ptr被创建时,它对应计数器被初始化为1。每当赋值另外一个shared_ptr共享同一个对象时,计数器值会加1。...所以shared_ptr析构时,将该指针指向对象释放掉了,导致指针`q`变成一个悬空指针

28000
领券