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

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

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

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. MySQL Delete 表数据后,磁盘空间并未释放,为什么?

    有开发小哥咨询了一个问题,记录一下处理过程分享给有需要的朋友.问题如下:MySQL数据库中有几张表增删比较频繁.数据变动剧烈且数据量大,导致数据增长过快,磁盘占用多.为了节约成本,定期进行数据备份,并 ...

  2. 自定义注解+反射提取对象到map中

    一.问题:有时候我们与第三方接口对接传参时,需要将对象里的字段和值以map形式传给别人,此时可以借助其他的工具类,但是我个人用起来不太灵活,还会把多余的字段传给别人,因此我们自己动手搞一套 二.思路: ...

  3. 【笔记】DDD实战课-人保架构欧创新

    目录 开篇 学好DDD,你能做什么? 基础 领域驱动设计:微服务设计为什么要选择 DDD? DDD的两层设计 DDD与微服务的关系 领域.子域.核心域.通用域和支撑域:傻傻分不清? 领域和子域 核心域 ...

  4. 像MIUI一样做Zabbix二次开发(1)——MIUI之于Android,乐维监控之于Zabbix

    摘要 文章主要介绍:7年做Zabbix二次开发,讲述那些从技术方向的选择,到开发.架构设计.深度定制,到我们的更多前瞻性想法. 关于MIUI "专注.极致.口碑.快"成了雷布斯的口 ...

  5. Servicemonitor监控自带metrics接口和无metrics接口

    前言: servicemonitor监控存在两种情况: 1.有metrics ,创建service+servicemonitor配置 2.无metrics  配置exporter,exporter进行 ...

  6. 312. 戳气球 (Hard)

    问题描述 312. 戳气球 (Hard) 有 n 个气球,编号为 0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.戳破第 i 个气球,你可以获 ...

  7. JS根据分数,计算名次(分数相同名次相同)

    一开始的接口返回数据(数据已经拍好顺序,但是分数相同名次不同),如果数据未排序,先用sort排序,由大到小 分数相同名次相同,则需要以下操作即可 let prescore = 0;//初始分数 let ...

  8. ssr next 学习记录

    预加载页面   只有生产环境才有 当页面初始化加载时,getInitialProps只会加载在服务端.只有当路由跳转(Link组件跳转或 API 方法跳转)时,客户端才会执行getInitialPro ...

  9. java面向对象九个经典例子程序

    1 Hello world例子 1 package Example; //定义自己的包名 2 3 public class Example1 //定义一个类 4 { 5 public static v ...

  10. memoのcmake和pkgconfig

    之前看到过pkgconfig,完全不理解什么东西,也没有去探究这到底是个啥. 然而今天想要cmake brew的库,无意中查到一种解决方案,就是利用pkg-config. 老神奇了. # includ ...