首页 > 编程语言 >论 C++、C语言中指针的实用价值(一)

论 C++、C语言中指针的实用价值(一)

时间:2022-10-27 22:45:16浏览次数:41  
标签:返回 函数 对象 C++ C语言 地址 实用价值 变量 指针

指针的价值在于哪里?单纯为了迷惑别人?其实并非如此、本系列长期总结一些必须用指针或者用指针很好的场合:

写任何的代码都必须有一定的动机、而不是想怎么写就怎么写

写代码不是纯灵感的行为、也不是纯机械的行为、而是有逻辑的举一反三。

1. 把一个指针传入一个函数(签名里不加 const)的行为的动机:

  1) 减少拷贝的数据量-----函数的调用是用栈的(除非 inline 函数)、虽然可以简单认为拿函数体的代码替换掉函数调用一切都

  能正常工作、但编译器并不是这样干的、简单替换掉代码的语法是 宏、 宏和函数是不同的。

  2)期望函数内部的修改能反映到调用者

2. A 类保留一个 B类的指针的动机:

  1)如果保留的是 B 类的 一个对象、那么首先会占一块内存、如果是指针、那么就是占 4 或者 8 字节而已(取决于编译的平台)

  2)保留B类的对象、可以做到一种效果:

    B类的一个对象自己做了某些操作后,B类的状态改变了,但地址还是不变的,如果A之前拿到这个对象的地址,这时候A类拿这个地址就可以调这个对象的一些方法。

  3)可以在头文件里写个 class xxx * ,这样就暂时不需要引入实际的xxx的头文件、因为这个成员变量的大小是确定的。

3. 一个工厂函数、或者要做某些对象创建的函数、它们返回指针的动机:

  如果没有指针,像java一样、return new Person()? java的 new 语义也是产生一个指针(虽然看上去不是指针)

  而在C++ 如果 return 一个局部变量、其实也不是不行:

 

 

 但我在这种情况应该返回指针、而不是直接把变量返回了、因为这里是存在数据拷贝的、如果这个结构体不仅仅两个字段、而是10000个?那就恶心了

但返回指针能不能写成这样?这样最后的执行结果是什么?1 还是 2?还是别的?

 

 

 因为 p 是栈上的变量、但是第一次 genPoint()之后会弹栈、可是我们在main中还拿着人家的地址、并且希望x、y值不变

但假如又调用一次genPoint()、那么地址还是那个地址、但内容其实偷偷的就改了!!!

 

 

 所以说不是不能返回一个局部变量的地址、地址就是个整数、没有任何语法说返回整数都不行

但这样写程序是不符合我们的想法的、甚至假如我在genPoint()之后调用点别的东西、程序甚至会崩溃或者混乱、具体会发生什么可以去反汇编看看:

 

 

 总而言是、要从函数中返回”对象“(或者理解成结构体也行、c++里不挑这些毛病、对象就是一块内存、函数是不跟每个对象存在一起的!)

  1 可以返回栈上的变量、但这样有拷贝

  2.返回一个栈上的变量的地址、会有未定义的行为和高风险

  3.返回一个 new 出来的东西的地址、并且调用者要记得返回

  4.智能指针(暂时不讨论)

这样写智能指针还是错误的写法,只是简单的包装一层不会解决本质的问题、而且智能指针的初心是为了防止人们忘记释放内存

 

这样就对了:

 

 

 

 

 

 

标签:返回,函数,对象,C++,C语言,地址,实用价值,变量,指针
From: https://www.cnblogs.com/gs590/p/16834192.html

相关文章

  • 泛化之美 —— C++11 可变参数模板的妙用
    概述首先这篇文章出自博客园作者:[......
  • C语言简单习题2
    求三角形面积1、定义一个函数area,求三角形的面积。要求形式参数为三角形的三个边长a,b,c,边长都为单精度浮点数,函数返回三角形的面积(保留2位小数)。公式如下:2、在main函......
  • c++ 按行读取文件、最好理解、最安全、最不容易出错的方法:
    注意、必须判断一下打开文件是否成功、不然如果输入一个不存在的文件名、程序会陷入死循环:类比Java的文件操作、Java的InputStream需要嵌套几层、需要new出实际的对象......
  • C++对象模型:g++的实现(三)
    这篇讲一下《深度探索C++对象模型》第三章最后没总结的一部分,就是类的成员变量指针。这里所谓类的成员变量指针就是指绑定某个类的某个成员变量的指针,而不是某个对象的某......
  • C语言学生管理系统(将数据保存至TXT文档)附源码
    C语言学生管理系统(将数据保存至TXT文档)在大一学习完C语言之后,回家遇到疫情,便有了用C语言写一个学生管理系统的想法,在家花费了一些时间,刚开始写了一点,后来可能是因为学艺不......
  • Modern C++ 智能指针 shared_ptr
    现代C++为了解决内存泄露以及资源回收等问题,引入了智能指针的概念。在日常的C++实践中也是高频使用。本文是在实践过程中,对现代C++中的智能指针进行的一个稍微全面的总结......
  • 在C语言中,%03d
    %03d用在printf或scanf函数中的格式符,用来以特定的格式输入和输出字符。%是格式符的开始。d表示有符号整数。3表示最小输出3位数字。0表示如果数字不足3位,在左边用......
  • C语言学习【字符串】
    voidappends(char*src,char*des,intsrc_len,intdes_len){inti=0;//第一种写法while(i<src_len){i++;*(des+des_len+i)=*(src+i......
  • Python,C++中点云 .las转.pcd
    (39条消息)Python,C++中点云.las转.pcd_程序媛一枚~的博客-CSDN博客1.Python.las转.pcd#-*-coding:utf-8-*-#读取las文件并保留为XYZI格式的pcd文件import......
  • 如何在CMake中启用C++ 17
    如何在CMake中启用C++17MiP*_*MiP  38 c++ cmake visual-studio c++17 我正在使用VS15.3,它支持集成的CMake3.8.如何在不为每个特定编译器编写标志的情况下定......