| |
|
开发:
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只开辟空间,不进行类型检查,返回一个无类型指针,必须加强制类型转换 ?? ?int *p = NULL; ?? 长度:sizeof(类型)*数量
calloc???????? 开辟空间时,对空间进行初始化 用法:void*calloc(元素的数目,每个元素的大小) 调用成功后,malloc和calloc都返回分配空间的首地址 realloc? 更改已配置空间的内存大小 用法:realloc(更改指针名,更改成的大小) 内存减小时:直接减,如果原来的空间位置内容未被修改,依旧可以打印原来的数 内存增大 1、当前内存段后有足够的内存空间大小,直接扩展,realloc()将返回原指针 2、当前内存后的空间不够,就使用堆中第一个满足要求的内存块,将目前数据复制到新的位置,并将原来的数据块释放掉,放回新的内存块位置 3、如果申请失败,讲返回NULL,此时,原来指针依旧有效
释放malloc calloc、realloc函数给指针变量分配的内存空间 注意:1、使用时添加函数库#include<stdlib.h> |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |