2022-04-02-
摘要
指针是什么
指针的作用
如何避免野指针
总结
目录
指针是什么
指针是什么?
指针理解的2个要点:
- 指针是内存中一个最小单元的编号,也就是地址
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
指针就是地址,指向某一块内存空间。
我们有一个变量在栈中被创建,如果我们想找到它有几种方式呢?
- 通过变量名去访问
- 通过地址访问
这一个个编号就是虚拟内存地址,相当于将内存分为以一个字节为基本单位的很多单元体,通过对这些单元体的编号,我们就可以在任何位置找到一个对应的编号。
像不像我们现实中的地址门牌号?
指针变量
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个
变量就是指针变量
int main()
{
int a = 10;//在内存栈中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
//中,p就是一个之指针变量。
return 0;
}
指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
那这里的问题是:
- 一个小的单元到底是多大?(1个字节)
- 如何编址?
经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电
平(低电压)就是(1或者0);
这样每个地址就可以用32个二进制位表示。每个二进制位有两种情况。
那么32根地址线产生的地址就会是:232
每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB ==
232 / 1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G的空闲进行编址。
这里我们就明白:
-
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以
-
一个指针变量的大小就应该是4个字节。
那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地
址。总结:
-
指针是用来存放地址的,地址是唯一标示一块地址空间的。
-
指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针和指针类型
先看看基本类型:
整形
int
char
short
long
longlong
浮点型
double
float
那么指针指向不同的类型,是不是就代表着指针类型的不同呢?
准确的说:当然。
如下代码:
int a = 0;
int* p = &a;
p就是一个 指针变量指向一个int类型的数据。
根据a的类型的不同,p的类型也要做出相应的调正。
我们知道p就是一个指针变量,那它的类型是怎样的呢?
我们给指针变量相应的类型。
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
可以看到任何任何类型的指针的变量前都有一个 * , 大致模样是
type + * + 变量名
char*
类型的指针是为了存放 char
类型变量的地址。
short*
类型的指针是为了存放 short
类型变量的地址。
int*
类型的指针是为了存放 int
类型变量的地址。
指针可以根据指向不同的类型来分类,那么它们作用上有什么不同?
通常来说,想通过地址访问变量,不同变量的存储方式,大小都不同,那么指针去访问的时候的权限以及解引用访问方式是不是应该也不同。
int i;
double d;
//假如它们的首地址相同
int<