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

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

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

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

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

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

    21.4K11

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

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

    26140

    C++ 动态内存

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

    82220

    【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返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。

    92430

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

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

    1.1K30

    C++的auto_ptr智能指针:从诞生到被弃用的历程

    所有权转移引发的困惑auto_ptr的一个核心特性是所有权转移。当一个auto_ptr对象被赋值给另一个auto_ptr对象时,所有权会发生转移,原auto_ptr对象将不再拥有对象。...这一特性在某些情况下可能会导致意外的错误和难以理解的代码行为。...,但在赋值给p2后,p1失去了对该对象的所有权。...如果后续代码中不小心再次使用p1,可能会引发未定义行为,因为p1此时已经不再指向有效的内存。此外,在容器中使用auto_ptr时,所有权转移的问题会变得更加复杂和难以控制。...unique_ptr通过禁用拷贝构造函数和拷贝赋值运算符,确保了对象的所有权唯一性。同时,unique_ptr支持自定义删除器,可以方便地管理不同类型的资源。

    14410

    【C++】—掌握STL string类:string的模拟实现

    此外当两个对象中的一个被销毁并释放它所占用的内存时,另一个对象将拥有一个悬垂指针(dangling pointer),即指向已经被释放的内存的指针。这可能导致未定义行为,包括程序崩溃。...浅拷贝的实现 在c++中,如果没有显式定义拷贝构造函数或者赋值重载函数,编译器将自动生成默认的拷贝构造函数和赋值运算符重载函数,它们执行的是浅拷贝。...(s2.data, "world"); //尝试打印s1的数据(可能导致程序崩溃) s1.print();//未定义行为,因为s1的data指针现在指向的资源已经被释放 return...深拷贝的必要性 在c++中,当对象包含指向动态分配内存的指针时,仅仅复制这些指针的值(即地址)时不够的。这是因为两个对象公用同一块内存,从而导致潜在的内存管理问题,如重复释放内存或者内存泄漏。...深拷贝的实现 在c++中,实现深拷贝通常涉及以下步骤: • 定义拷贝构造函数: 拷贝构造函数是一个特殊的构造函数,它接受一个同类型对象的引用作为参数。

    6010

    深入理解 C++17 中的 std::launder

    如果此时直接通过旧的指针去访问新创建的对象,由于编译器依据旧的内存模型进行操作,就可能会导致错误的结果,甚至引发程序崩溃。这种错误的根源就在于程序的行为违反了编译器的预期,从而导致了未定义行为的出现。...,首先通过 new 操作符创建了一个 X 类型的对象,并将其指针赋值给 p。...在这种情况下,std::launder 可以确保通过正确的指针来访问新的虚函数表,从而避免未定义行为的发生。...在调用 transmogrify 函数后,如果不使用 std::launder,直接通过 &i 调用 transmogrify 函数,由于虚函数表已经发生了变化,将会导致未定义行为。...在 operator* 函数中,通过 std::launder(&payload) 来获取指向新对象的正确指针,从而确保在访问 payload 成员时的行为是正确的,避免了未定义行为的出现。

    4300

    深拷贝与浅拷贝

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

    14110

    【C++进阶学习】第十三弹——C++智能指针的深入解析

    前言: 在C++编程中,内存管理是至关重要的一个环节。传统的手动内存管理方式容易导致内存泄漏、悬挂指针等问题。为了解决这些问题,C++引入了智能指针。...本文将详细讲解C++中智能指针的概念、种类、使用方法以及注意事项。 一、引言 在正式讲解智能指针之前,我们先来了解一下为什么会诞生智能指针: 在C++中,指针是用于访问内存地址的一种特殊变量。...悬挂指针:当指针指向的内存被释放后,如果指针没有被设置为NULL,那么它就变成了悬挂指针,访问悬挂指针可能会导致未定义行为。 双重释放:当指针被错误地释放两次时,会引发程序崩溃。...当std::unique_ptr被销毁或赋值给另一个std::unique_ptr时,它所指向的内存会被自动释放。...了解智能指针的行为:在使用智能指针之前,要了解它们的行为,以避免潜在的问题。

    12110

    《C++位域:在复杂数据结构中的精准驾驭与风险规避》

    在 C++的广阔编程世界中,位域作为一种强大的工具,可以在复杂数据结构中实现高效的内存利用和特定的数据表示。然而,若使用不当,位域也可能带来未定义行为,成为程序中的潜在隐患。...本文将深入探讨 C++位域在复杂数据结构中的正确使用方法,以及如何避免未定义行为,为广大 C++开发者提供实用的指南。...因此,在跨平台开发中,使用位域可能会引发未定义行为。 2. 位域的赋值和读取 对位域进行赋值和读取时,需要注意位域的边界和溢出问题。如果对位域进行赋值超出了其指定的位宽范围,可能会导致未定义行为。...在设计复杂数据结构时,要考虑位域的内存布局对整个结构的影响,避免出现未定义行为。 五、总结 C++位域在复杂数据结构中具有重要的应用价值,可以实现高效的内存利用和特定的数据表示。...只有这样,我们才能在复杂的数据结构中精准驾驭位域,避免未定义行为,为开发高质量的 C++程序奠定坚实的基础。

    12010

    c++深拷贝和浅拷贝

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

    44010

    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.7K20

    【C++修炼之路】C++类类和对象进一步探索,六个幕后英雄

    它是对象的“出生证明”,确保对象在诞生时处于有效状态。如果没有构造函数,对象可能包含未初始化的数据,导致程序行为不可预测。...三、析构函数:对象的“临终遗言” 3.1析构函数的概念 在C++中,析构函数是类的特殊成员函数,负责在对象销毁时释放资源。...四、拷贝构造函数:对象的“克隆术” 4.1 拷贝构造函数的概念 在C++中,拷贝构造函数是类的特殊成员函数,用于用一个对象初始化另一个对象。...当其中一个对象销毁时,另一个对象的指针将指向无效内存。 深拷贝与浅拷贝: 浅拷贝:只复制指针的值,不复制指针指向的内容。...希望本文能为你打下坚实的基础,助你在C++的世界中游刃有余!

    5610

    Rust避坑现代C++悬垂指针

    再次解引用(dereference)这样的指针会导致未定义行为。这是一种常见的C/C++编程错误,如下代码所示。...代码通过智能指针管理一个整数,当智能指针被销毁后,原先获取的裸指针仍然指向已释放的内存,导致悬垂指针的产生。最后,代码尝试访问这个悬垂指针指向的值,展示了未定义行为的可能结果。...观察者模式中的弱引用。缓存实现。第12行通过smartPtr.get()方法获取智能指针所管理的裸指针,并赋值给rawPtr。第14行输出智能指针管理的值,通过解引用smartPtr得到42。...这是未定义行为,可能导致程序崩溃或输出不可预期的结果。第22行返回0,表示程序正常结束。第23行结束main函数。代码后的Output输出第四行,尝试访问悬垂裸指针rawPtr指向的值,输出为0。...在实现某些设计模式(如状态模式)时很有用。第8行从 smart_ptr 中获取一个不可变引用,并赋值给 reference。&*smart_ptr 首先解引用 Box,然后再创建引用。下面逐步解释。

    58161

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

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

    2.8K20

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

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

    1.4K10
    领券