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

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

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

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语言中指针的实用价值(一)的更多相关文章

  1. C语言中指针占据内存空间问题

    以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...

  2. 这样子来理解C语言中指针的指针

    友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...

  3. C语言中指针和数组

    C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之 ...

  4. C语言中指针*p[N], (*P)[N],及**p的区别

    在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...

  5. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  6. 编程基础-c语言中指针、sizeof用法总结

    1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...

  7. C语言中指针和多维数组

    指针和多维数组 数组名是特殊的指针 数组是一个特殊的指针,多维数组也是更为复杂的数组,它们的关系是什么样的呢? 我们通过一个简单的例子来比较形象的了解指针和多维数组: int a[2][3]; 这是一 ...

  8. 对C语言中指针的一些新认识

    学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的    指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...

  9. C语言中 指针和数组

    C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象.与之相反,指针用来存储单个内存地址.数组和指针不是同一种结构因此不可以互相转换.而数组变量指向了数组的第一个元素的内存地址. 一个数组变 ...

  10. C语言中指针中的值赋值给数组

    如果把各种语言做个冷兵器类比的话,C语言一定是刀客的最佳工具.入门很简单,但是要是能把它熟练运用,那就是顶尖级别的高手了. 用了那么多年的C语言,发现自己还是仅仅处于熟练的操作工.今天遇到了一个bug ...

随机推荐

  1. android kotlin data class的公共参数解决

    kotlin的 data class 不能简略的继承 另一个 data class(要初始化对应父类的值) 尝试使用 sealed class 解决 sealed class CommonParams ...

  2. 使用JavaHTTPClient发送请求

    import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders ...

  3. iOS的一些性能优化

    1. 卡顿优化-CPU 尽量使用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView 不要频繁地调用UIView的相关属性,比如frame.bounds.tranform ...

  4. HDLbits——Exams/2014 q4b

    题目要求 使用verilog描述如图所示得移位寄存器: Write a top-level Verilog module (named top_module) for the shift regist ...

  5. 遮罩DIV遮挡住下面元素 下面元素如何触发响应点击事件

    遮罩DIV{ pointer-events: none; }

  6. Typora笔记收费的解决

    现在的Typora收费了,但是官网还是可以找到历史版本 Typora在1.0版本之前的不收费!!! 所有只需要下载1.0版本之前的版本就可以解决 Windows历史版本地址:https://typor ...

  7. maridb数据库表及字段增删改

    mariadb数据类型 mariadb数据类型分为数字.日期.时间以及字符串值. 适用类型原则:够用就行,尽量使用范围小的,而不用大的 常用数据类型: 1.整数 int,bit   #例如 年纪 适用 ...

  8. CompletableFuture的使用

    1 List<List<String>> subList = CommonUtils.splitList(pendingIds, 500);private static fin ...

  9. jmeter的阶梯式加压性能测试 jp@gc - Stepping Thread Group (deprecated)

    当测试需求要求是阶梯型的压力测试场景时,使用该线程组. 比如测试场景是    从100并发开始,每60s加压50并发,直至达到目的并发数(中途发现问题随时停掉),之后保持每60s停止50并发的速率关闭 ...

  10. rabbitmq 使用管理页面向队列中推送消息

    参考:https://blog.csdn.net/weixin_43343423/article/details/103382661