IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 指针概述和使用注意事项 -> 正文阅读

[C++知识库]指针概述和使用注意事项

一、指针是什么

二、多级指针

三、野指针

四、内存分配方式

malloc、calloc和realloc作用和区别

概述

一、指针是什么

1、指针是一种数据类型,可以定义变量,保存的内容是地址

2、指针的作用

指针保存的是地址,通过指针变量可以操作地址,即可直接操作寄存器地址,从而实现直接访问硬件,这是C语言与其他语言最大的不同。

3、因为地址是固定的长度,所以指针变量的长度也是固定的,系统位数的决定指针变量的字节长度,64位系统地址指针变量长度为8字节,32位系统指针变量长度为4字节

4、为什么指针的字节长度固定了还要定义不同的类型

因为指针的地址属性———步长(做加1操作所移动的字节数),不同类型的指针变量保存不同步长的地址。

地址+操作数=地址

5、指针的作用

指针保存的是地址,通过指针变量可以操作地址,即可直接操作寄存器地址,从而实现直接访问硬件,这是C语言与其他语言最大的不同。

6、直接访问和间接访问

变量内保存内容,指针通过保存变量的首地址来间接访问变量的内容

7、*和&

* 指针标识符 间接运算符

& 取地址符???

*p=a?? =》p=&a?????????????? 相当于逆运算,&是内容向外取地址,*是地址向内取内容

8、指针的定义方式

int a;int * p=&a;

=》int a;int*p;p1=&a

指针阅读——右左法则

int*p

p? 没有()[] 所以是一个变量??? *表示指针标识符,说明保存的是地址,这个变量是指针变量, int说明是一个整形的指针变量

9、指针的偏移

p++??? p中保存的是变量地址,++表示变量地址加1个步长,表示变量的下一个内容

(*p)++???? *p是指针里的内容,++ 表示字节地址里的内容加1,加一个字节

二、多级指针

1、多级指针的作用

保存上一级指针的地址,应用在函数的传参

注意:1、相同类型指针之间才可以赋值

?????????? 2、void* 万能指针,用来接受任意类型的值 (不知道返回值的情况下),但不能直接打印内容,步长为1

?????????? 3、指针的加减,可以减不能加?? 指针+指针 返回error?? 指针减指针?? 返回两个地址数据的个数(指针类型相同)

三、野指针

1、什么是野指针

指针变量里保存的地址对应空间无访问权限(指针所指向的地址空间无访问权限)

2、野指针的出现

1.定义后未初始化的指针;2、释放结束之后的指针;3、越界访问的指针(指向分配空间之后的指针)

3、野指针出现产生的问题

内存泄露,运行时错误,内存错误(段错误)

4、如何避免野指针

编码习惯

1、定义变量时必须初始化

???? 1.当指针变量作为指向工具时,定义初始化NULL;

???? 2.当指针变量指向的空间赋值时,需要动态申请空间

2、使用时

???? 1.检查内存空间是否分配成功

???? 2.初始化内存空间(清零内存)

???? 3.防止越界访问

3、使用结束

???? 1.必须释放空间

???? 2.释放解释一定将指针再次置为NULL

NULL什么鬼?

简单理解0,但不等于0,NULL用于指针和对象,0用于数值,因为NULL大多数情况下指向0,所以#defined NULL 0;但并不是说NULL=0

四、内存空间分配

1、分配方式

???? 静态方式:开销小,但是空间利用率不高

???? 动态分配:开销大,提高空间利用率

malloc calloc和realloc

?malloc

malloc只开辟空间,不进行类型检查,返回一个无类型指针,必须加强制类型转换
指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)

?? ?int *p = NULL;
?? ?int n = 10;
?? ?p = (int *)malloc (sizeof(int) * n);

?? 长度:sizeof(类型)*数量


如果多次申请空间那么系统是如何做到空间的不重复使用呢?
在使用malloc开辟一段空间之后,系统会在这段空间之前做一个标记(0或1),当malloc函数开辟空间如果遇到标记为0就在此开辟,如果为1说明此空间正在被使用

calloc???????? 开辟空间时,对空间进行初始化

用法:void*calloc(元素的数目,每个元素的大小)

调用成功后,malloc和calloc都返回分配空间的首地址

realloc? 更改已配置空间的内存大小

用法:realloc(更改指针名,更改成的大小)

内存减小时:直接减,如果原来的空间位置内容未被修改,依旧可以打印原来的数

内存增大

1、当前内存段后有足够的内存空间大小,直接扩展,realloc()将返回原指针

2、当前内存后的空间不够,就使用堆中第一个满足要求的内存块,将目前数据复制到新的位置,并将原来的数据块释放掉,放回新的内存块位置

3、如果申请失败,讲返回NULL,此时,原来指针依旧有效


free函数

释放malloc calloc、realloc函数给指针变量分配的内存空间

注意:1、使用时添加函数库#include<stdlib.h>
?????????? 2、在堆空间开辟内存

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:27:06  更:2021-11-19 17:27:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:21:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码