首页 > 编程语言 >C++指针函数体内部初始化需要注意的地方

C++指针函数体内部初始化需要注意的地方

时间:2024-11-21 16:49:39浏览次数:3  
标签:初始化 int nullptr C++ changePtr 地址 指针

有如下代码:

void changePtr(int *p) {
   *p = 4;
}
int main()
{
  int* p = new int(5);	
  changePtr(p);
  cout << " *p:" << *p << endl;
}

以上代码我们都知道传递指针,函数改变了指针指向地址内的数据,
函数体外部调用时p指向地址发生了改变,输出结果由5->4。
但是在实际开发中碰到一种情况,本身初始化指针为nullptr,由函数内部进行初始化操作,如下代码:

void changePtr(int *p) {
    p = new int(4);
}
int main() {
    int* p = nullptr;

    changePtr(p);
    cout << " *p:" << *p << endl;
    return 0;
}

乍一看貌似什么问题,外部调用p时应该是已经初始化好的指针p,但是发现函数调用后p依然为nullptr。
问题原因:我们知道p传入时地址是一个nullptr值,想通过函数给p地址赋值,但是忽略了,此时函数调用了一次赋值操作,p在函数体内部的地址确实改变了,但是不会影响外部变化,所以导致外部调用时依旧为nullptr(注意此处注意区分地址和地址指向值得不同)这就像值传递和引用传递。
所以修改如下:

void changePtr(int **p) {
    *p = new int(4);
}
int main() {
    int* p = nullptr;
    changePtr(&p);
    cout << " *p:" << *p << endl;
    return 0;
}

或者

void changePtr(int *&p) {
    p = new int(4);
}
int main() {
    int* p = nullptr;
    changePtr(p);
    cout << " *p:" << *p << endl;
    return 0;
}

但是需要注意的地方这里我们函数体内初始化指针,这样存在内存泄漏问题,这是迫不得已的情况,实际开发需要注意,在哪里创建需要在哪释放掉。

标签:初始化,int,nullptr,C++,changePtr,地址,指针
From: https://blog.csdn.net/muyuchengfeng_/article/details/143949412

相关文章

  • VC++ 中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用总结
    关键字:宏,预定义宏,预处理,预编译头,VC,#pragma,编译选项,程序区段目录C/C++预定义宏例子:C/C++预定义宏的取值C/C++预定义宏用途:诊断与调试输出CRT的诊断与调试输出:assert,_ASSERT/_ASSERTE,_RPTn/_RPTFn/_RPTWn/_RPTFWnMFC的诊断与调试输出:ASSERT/VERIFY,ASSERT_V......
  • C++:类的继承
    在C++中,类的继承是一种面向对象编程(OOP)的重要特性,它允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。通过继承,可以重用现有的代码,减少重复代码,提高代码的可维护性和扩展性。1.基本概念基类(BaseClass或ParentClass):被继承的类。派生类(DerivedClass或Chi......
  • C++最佳情侣身高差 2024年9月c++一级 电子学会中小学生软件编程C++等级考试一级真题答
    目录C++最佳情侣身高差一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析C++最佳情侣身高差2024年9月C++编程等级考试一级编程题一、题目要求1、编程实现专家通过多组情侣研究数据发现,最佳的情侣身高差遵循......
  • 初识C++
    目录1.C++发展历史2.C++在工作领域中的应用3.第一个C++程序3.1梦开始的地方:打印helloworld4.命名空间4.1namespace的价值4.2namespace的定义4.3命名空间的使用5.C++输入&输出6.缺省参数7.函数重载8.引用8.1引用的概念的定义8.2引用的特性8.3引......
  • 深入计算机语言之C++:STL之vector的认识和使用
    ......
  • Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
    一、前言说明在地图应用中,有很多时候是需要断网环境中离线使用的,一般会采用两种做法,一种是只下载好离线瓦片地图,然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持,只需要拿到瓦片即可,缺点是其他的接口都需要自己处理,比如覆盖物的绘制,工作量巨大,尽管Qt的qml......
  • C++基础知识概述(二)
    一、形参带默认值的函数 二、inline内联函数三、const用法1.const修饰的变量不能作为左值,初始化完成后,值不能修改 2.C与C++中const的区别是:编译方式不同 C:作为一个变量来编译生成指令,C中的const可以不必被初始化,能正常编译,不叫常量,叫常变量。constinta=20;......
  • 深入理解C++11右值引用与移动语义:高效编程的基石
    文章目录前言......
  • C++ list (链表)容器
    C++ list 链表#include<iostream>usingnamespacestd;#include<list>voidprintList(constlist<int>&L){ for(list<int>::const_iteratorit=L.begin();it!=L.end();it++) { cout<<*it<<"";......
  • C++ 模板元编程高级技巧与大型项目架构中的应用实践
    C++模板元编程(TemplateMetaprogramming,TMP)是一种利用C++模板在编译时进行计算和逻辑推理的技术。模板元编程可以极大地提升程序的灵活性、性能和可扩展性,尤其是在大型项目的架构中,能够有效地处理类型推导、优化计算和代码生成等任务。随着C++11、C++14、C++17和C++20......