我想你一定和我一样刚开始接触C++的时候,被指针(pointer)引用(reference)内存分区等等诸多概念,弄得很头疼吧。其实回头想想,C/C++,python,java,shell...学习起来都有一个共性,那就是敲敲敲,多敲几遍代码,可能会有一些问题,带着问题去学习,整理它。然后将技术不断的应用于工作中的新场景,很快就可以掌握一门新技术了,不建议毫无基础的情况下,学习特别深的理论知识。

1、   指针也是一种数据类型

1)指针也是一种变量,占有内存空间,用来保存内存地址

//测试指针变量占有内存空间大小
void main()
{int* p = nullptr;cout << "指针的大小" << sizeof(p) << endl;int a = 10;p = &a;cout << "指针的大小" << sizeof(p) << endl;system("pause");return;
}

2)*p操作内存

在指针声明时,*号表示所声明的变量为指针(int* 代表的是指向地址中存储的数据类型为int)

在指针使用时,*号表示 操作 指针所指向的内存空间中的值

*p相当于通过地址(p变量的值)找到一块内存;然后操作内存

*p放在等号的左边赋值(给内存赋值)

*p放在等号的右边取值(从内存获取值)

3)指针变量和它指向的内存块是两个不同的概念

//含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; //p++

//含义2 给*p赋值*p='a'; 不会改变指针变量的值,只会改变所指的内存块的值

*p可以理解一个钥匙

//含义3 =左边*p 表示 给内存赋值, =右边*p 表示取值 含义不同切结!

//含义4 =左边char *p

//含义5 保证所指的内存块能修改

4)指针是一种数据类型,是指它指向的内存空间的数据类型

含义1:指针步长(p++),根据所致内存空间的数据类型来确定

p++=è(unsigned char )p+sizeof(a);

结论:指针的步长,根据所指内存空间类型来定。*很重要

注意:     建立指针指向谁,就把把谁的地址赋值给指针。图和代码和二为一。

不断的给指针变量赋值,就是不断的改变指针变量(和所指向内存空间没有任何关系)。

改变指针变量的值,更改的是指向的位置,不会更改指向位置内存空间中存储的值

2、间接赋值(*p)

1)两码事:指针变量和它指向的内存块变量

2)条件反射:指针指向某个变量,就是把某个变量地址否给指针

3)*p间接赋值成立条件:3个条件

void main1()
{int a = 0;cout <<"原始a:"<< a << endl;int* p = &a;*p = 10;//通过*p更改p指向内存空间的内容,间接修改a的值cout << "修改后a:" << a << endl;}

1)2个变量(通常一个实参,一个形参)

2) 建立关系,实参取地址赋给形参指针

3) *p形参去间接修改实参的值

4)函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来。

指针作为函数参数的精髓。

3、指针在内存四区中的分布

  1. 主调函数 被调函数

    1. 主调函数可把堆区、栈区、全局数据内存地址传给被调用函数
    2. 被调用函数只能返回堆区、全局数据
  2. 内存分配方式
    1. 指针做函数参数,是有输入和输出特性的。

4、应用指针必须和函数调用相结合(指针做函数参数)

编号

指针函数参数

内存分配方式(级别+堆栈)

主调函数

实参

被调函数

形参

备注

01

1级指针

(做输入)

分配

使用

一般应用禁用

分配

使用

常用

Int showbuf(char *p);

int showArray(int *array, int iNum)

02

1级指针

(做输出)

使用

结果传出

常用

int geLen(char *pFileName, int *pfileLen);

03

2级指针

(做输入)

分配

使用

一般应用禁用

分配

使用

常用

int main(int arc ,char *arg[]); 指针数组

int shouMatrix(int [3][4], int iLine);二维字符串数组

04

2级指针

(做输出)

使用

分配

常用,但不建议用,转化成02

int getData(char **data, int *dataLen);

Int getData_Free(void *data);

Int getData_Free(void **data); //避免野指针

05

3级指针

(做输出)

使用

分配

不常用

int getFileAllLine(char ***content, int *pLine);

int getFileAllLine_Free(char ***content, int *pLine);

指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。

  1. 如果基础类int变量,不需要用指针;
  2. 若内存块是1维、2维。

5、一级指针做函数参数

一级指针做输入

int showbuf(char *p)
{return sizeof(p);
}
void main()
{
//  char* p = nullptr;char tmp[] = "abcdefg2";char* p = tmp;int m = showbuf(p);cout << m << endl;system("pause");return;
}

一级指针做输出

char* showbuf(char *p)
{cout << p << &p << endl;return p;
}

理解

主调函数还是被调用函数分配内存

被调用函数是在heap/stack上分配内存

6、二级指针做函数参数

二级指针做输入int main(int arc ,char *arg[]); 字符串数组int shouMatrix(int [3][4], int iLine);二级指针做输出int Demo64_GetTeacher(Teacher **ppTeacher);int Demo65_GetTeacher_Free(Teacher **ppTeacher);int getData(char **data, int *dataLen);Int getData_Free(void *data);Int getData_Free2(void **data); //避免野指针理解主调函数还是被调用函数分配内存被调用函数是在heap/stack上分配内存

总结:

1)指针也是一种数据类型,指针的数据类型是指它所指向内存空间的数据类型

2)间接赋值*p是指针存在的最大意义

3)理解指针必须和内存四区概念相结合

4)应用指针必须和函数调用相结合(指针做函数参数)

指针是子弹,函数是枪管;子弹只有沿着枪管发射才能显示它的威力;指针的学习重点不言而喻了吧。接口的封装和设计、模块的划分、解决实际应用问题;它是你的工具。

5)指针指向谁就把谁的地址赋给指针

6)指针指向谁就把谁的地址赋给指针,用它对付链表轻松加愉快

7)链表入门的关键是分清楚链表操作和辅助指针变量之间的逻辑关系

8)C/C++语言有它自己的学习特点;

若java语言的学习特点是学习、应用、上项目;

那么C/C++语言的学习特点是:学习、理解、应用、上项目。多了一个步骤吧。

9)学好指针才学会了C语言的半壁江山

10) 理解指针关键在内存,没有内存哪来的内存首地址,没有内存首地址,哪来的指针啊。

C++指针详解(精心整理)相关推荐

  1. C++ 智能指针详解

    智能指针内容很多,重点是基本用法. #include <boost/shared_ptr.hpp> class CBase: public boost::enable_shared_fro ...

  2. C++Study 指针详解

    C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...

  3. php 数组 指针,php之数组指针详解

    本文主要和大家分享php之数组指针详解,首先我们会和大家分享php 数组指的针操作方法,希望能帮助到大家. 一.php 数组指针操作 利用php的内置函数:key,current,next(),pre ...

  4. C++ 中的this指针详解及实例

    C++ 中的this指针详解及实例 这篇文章主要介绍了C++ 中的this指针详解及实例的相关资料,this指针是类的一个自动生成.自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对 ...

  5. C/C++ 指针详解

    指针详解 参考视频:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感谢Bilibili@fengmuzi2003的搬运翻译及后续勘误,也感谢已故原作者Har ...

  6. c语言的指针详解ppt,最全的C语言指针详解.ppt

    最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...

  7. 筑基九层 —— 指针详解

    目录 前言: 指针详解 前言: 1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记 2.修炼必备 1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧 ...

  8. C语言指针详解——入门C语言指针,初级指针使用。

    原文地址:我的个人博客点击查看 C语言教程第二弹--指针详解 所有学过C语言的人都知道,C语言难在它的指针的使用和理解,今天,我带给大家C语言的指针的教程,供大家学习交流,如果有讲的不对的地方,请给作 ...

  9. 5G移动通信系统设计与标准详解 个人整理(PDF和Word)

    5G移动通信系统设计与标准详解 个人整理(PDF和Word) 链接:https://pan.baidu.com/s/134YxiXyP1f7Ab4BD75bs8Q  提取码:1001 Word示例 P ...

  10. 指针数组与数组指针详解

    指针数组与数组指针详解 1.什么是指针数组和数组指针? 指针数组:指针数组可以说成是"指针的数组",首先这个变量是一个数组,其次,"指针"修饰这个数组,意思是说 ...

最新文章

  1. 15 JS应用-todolist任务
  2. Fifth scrum meeting - 2015/10/30
  3. kafka consumer配置拉取速度慢_Kafka消费者的使用和原理
  4. 让网页图片变灰色的三种方法
  5. DSP之通信之MMC控制器
  6. 好奇怪呀后面加什么标点_沙发位后面是窗户有什么好的方案?
  7. 离线bootstrap_css下载
  8. Qi v1.2.4协议 之 11 Foreign Object Detection 【英文翻译】
  9. python做前端开发_Python开发【前端】:汇总
  10. 制作论坛发帖页面(操作节点的方式)(JavaScript)
  11. java gsoap mtom_mtom_xop 通过gsoap实现高效MTOM协议的数据传输 - 下载 - 搜珍网
  12. Python监控服务器显卡使用情况程序
  13. input/textarea 输入框点击有边框解决方法
  14. 怎么在cmd 窗口 远程连接服务器
  15. MySQL——VARCHAR和CHAR类型
  16. InfoSphere Guardium应用程序用户翻译
  17. 一些有趣的资源搜索网站
  18. Javaweb8==未实现前后端分离的列表展示、新增、删除、修改功能。 servlet(逻辑处理,封装数据进域对象,转发到jsp)+jsp(el表达式获取域对象中的数据+JSTL替换if for)。
  19. 后台架构设计—数据存储层
  20. postgresql数据库字节流类型详解

热门文章

  1. Redis基础数据结构String:你知道String长度限制多少吗
  2. 基于Android的课程作业,基于Android的大学生个人课程助理系统的设计与实现
  3. python人脸识别和人脸对比,face_recognition和OpenCV
  4. 期刊分区以及影响因子是什么?
  5. 谷歌浏览器无插件保存网页为长图
  6. 计算机需要什么才能连接网络,计算机必须安装网卡,才可以连接到Internet 。
  7. 3秒钟快速去水印,图片去水印从此不求人
  8. oracle查询所有表字段属性_Oracle查询表字段属性的方法
  9. glibc降级后怎么恢复 linux_驾驶证增驾年龄是怎么要求的?驾驶证降级后多久增驾...
  10. svg实现直线带右箭头