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

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

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

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

    IEC10X协议源码 https://github.com/airpig2011/IEC104 一.源码编译 下载源代码并解压 进入文件夹下test目录,对main.c进行修改 我们使用套接字来实现服 ...

  2. rest-assured:JUnit5中接口测试参数化的支持之利用EnumSource检查用户消息是否包含特定字段(JSON path $ doesn't match.)

    代码:package ghcdgj.restful.framework;import static org.junit.jupiter.api.Assertions.*;import static i ...

  3. protobuf如何还原proto源文件及描述字符串中左括弧的意义

    语法分析 和通常的有语法的结构一样,proto的编译也经过词法(tokenize)和语法(parse)两个阶段,相关代码分别在tokenizer.cc和parser.cc两个文件中. /// @fil ...

  4. vvv动态组件和keep-alive

    <!DOCTYPE html><html> <head> <style> </style> <script src="a.j ...

  5. EPLAN部件库汇总贴转

    经常看到网友求EPLAN部件库,授人以鱼不如授人以渔,大可不必把所有部件装上,比如软件自带的部件库,我都弃之不用,新建一个部件库,把工作中经常要用到的部件慢慢添加进去.慢慢的你会发现:画图效率越来越高 ...

  6. cmd 备份 oracle 数据 dmp文件

    语法 :     exp 用户名/密码@数据库地址/数据库名 file=文件导出地址/文件名.dmp 实例:exp develop/123@localhost/orcl file=e:/2019-02 ...

  7. django学习:转载

    https://www.cnblogs.com/ginvip/p/6894690.html https://www.cnblogs.com/yangmv/p/5327477.html https:// ...

  8. docker从C盘迁移到D盘

    docker镜像在C盘占据大量的空间,将.docker从C:\Users\Administrator迁移到E:\.docker. 一.关闭virtual Box 使virtual Box处于关闭.停止 ...

  9. 实验一 密码引擎-1-OpenEuler-OpenSSL编译

    1. 下载最新的OpenSSL源码 2. 用自己的8位学号建立一个文件夹,cd 你的学号,用pwd获得绝对路径 3. 参考https://www.cnblogs.com/rocedu/p/508762 ...

  10. 求两个自然数之间的最大公约数C++实现

    1 #include "pch.h" 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 ...