目录
前言
hello各位小伙伴,我是你们的博友ljp-nan,今天学习了指针初阶的一部分内容。我来总结一下今天的所学内容,目的是巩固今天所学知识。让我们开始今天的学习。
指针在初识C语言那篇文章已经简单的介绍过了,现在我们详细的介绍C语言中的指针。希望博友们可以在这篇文章中增长知识。话不多说,我们进入正题。
初阶指针讲解逻辑
在这篇文章我们只会讲解前三个表格的内容。
了解什么是指针
指针就是地址,地址就是指针。在计算机内存中会有许多大小为1个字节的内存块,每个内存块都有自己独立的地址,通过它们的地址就可以访问到每一个字节的内存。这里可以对比酒店房间的门牌号,如果要找到你的朋友在这个酒店的哪个房间,怎么找到这个房间,只需要告诉你门牌好就可以了。这样做,会使内存的使用和管理更加方便。如图所示,描述了内存块和地址之间的关系。
那么指针就是存放内存地址的变量,称为指针变量。也就是我们所说的指针。
我们可以通过&(取地址操作符)取出变量的内存地址,把地址存入一个变量中,这个变量就是指针变量。
如以下代码:
#include <stdio.h> int main() { int a = 0; //取出变量a的地址,放入整型指针变量中 int* p = &a; return 0; }
我们可以通过调试来观察变量p
指针总结:
- 指针变量,用来存放地址的变量。
- 一个小的内存单元里有一个字节
- 内存的编制
对于32位的机器,假设有32根地址总线,那么假设每根地址线在寻址的时候产生高电平和低电平就是1和0。
那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000002
……
11111111 11111111 11111111 11111111
总共有2的32次方种变化,每种变化对应一个地址,那么这里就有2^32次方个地址,所能表示的内存大小为:
2^32/1024 = 2^22 kb
2^22kb/1024 = 2^12mb
2^12mb/1024 = 2^2gb = 4gb
所以32根地址总线可以给4GB的内存空间寻址。同理,64位的机器可以为2^34GB的内存空间寻址。
4.这里我们就可以明白,32位机器上,地址是32个0或者32个1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。那如果是64位的机器上,如果有64根地址线,就有64个0或者64个1组成二进制序列,每八位为一个字节,这里就占用了八个字节的存储空间,所以,64位机器上的指针变量的大小为8个字节。
- 指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
- 指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针和指针类型
指针的类型可以是整型,短整型,长整型,单精度浮点型,双精度浮点型,结构体类型等等。
不同类型的指针存放对应类型数据的地址。
这里我们需要研究指针类型的意义是什么?
指针的类型决定了指针向前或向后跳过多少个字节。也就是一次可以跳过多少个字节,比如,整型指针每次跳过四个字节,字符型指针每次跳过一个字节。我们来验证这个说法:
指针的类型决定了,解引用时可以访问到多少字节,比如,整型指针一次解引用可以访问到4个字节,字符型指针一次可以访问一个字节。我们来验证这个说法:
int* 指针
char* 指针
这里要充分注意到,可以根据实际情况来选择什么类型的指针。
野指针
野指针是指针指向的位置是不可知的,不正确的,没有明确限制的,野指针就像是一只野狼,它毫无目的性的走过来走过去,不知道要走去哪,没有一个明确的去处,那就是在森林里游荡。野指针就是这个道理。
发生野指针的三种情况:
- 指针未初始化
- 指针越界访问
- 指针指向的空间释放
第一种情况,指针未初始化。
第二种情况指针越界访问
情况三,在后面的内存管理章节中详细介绍
规避野指针
- 在定义指针变量时,要进行初始化。
- 小心指针的越界访问。
- 指针指向的空间被释放,要及时把指针变量置为NULL。
- 避免返回局部变量的地址,因为在函数调用时,函数内的局部变量会在函数调用结束后销毁,那么这个变量的地址就不存在了。
- 在使用指针之前要检查指针的有效性。
谢谢大佬们的观看,指针的上部分内容就讲完了,让我们期待下部分内容。
请大佬们点点关注和赞。谢谢大佬们!