计算机系统应用教程网站

网站首页 > 技术文章 正文

C++_指针的定义使用_指针所占内存空间_空指针_野指针

btikc 2024-09-12 12:06:28 技术文章 17 ℃ 0 评论

?

然后我们再来学这个指针,指针是c系列语言中的,重要的部分,在其他的语言里没有,

所以也难一点.

?

可以看到通过

int * p; 定义一个指针,指针就是指向一个地址.

然后有个 int a =10;

可以看到这里,声明了一个a变量,的值是10


然后p = &a;

实际上就是 获取a变量的,地址,然后赋值给我们声明的这个指针p,那么,这个p指针,就可以指向,这个变量a的地址了.

?

可以看到我们可以通过&a 获取a变量的地址

然后我们也把p这个指针打印出来.

?

可以看到,&a,a变量的地址和p,这个指针的值是一样的,

因为p,指针就是一个地址,而这个地址,我们让他指向了a变量的地址.

?

?

然后我们可以通过*p 这样形式,来获取到p这个指针,指向的那个地址中,存的具体的内容的值,

当然也可以给,这个指针指向的地址,进行赋值.

?

可以看到,我们*p =1000

就是给p这个指针,指向的地址,中赋值了一个1000


而这个地址,指向的,也是变量a的,存放的内存的位置,所以,可以看到

我们给*p =1000 赋值1000,以后

我们打印*p 以及a 打印出来的内容是一样的.


?

上面是总结,然后我们再去看指针,占用的内存是多少

?

?

?

我们说指针,其实就是一个地址,这个地址是16进制的.

?

?

我们可以通过sizeof(int *) 来获取int类型的指针,占用的内存空间是多少可以看到,

在32位系统下,这个值是4个字节

?


?

然后我们也可以通过sizeof(p) 来获取指针p占用的内存空间是多少

可以看到,也是4对吧,因为我们知道,p也是int类型的指针.

?


?

然后我们再去,分别获取

int float double char 指针的,内存空间大小,可以看到都是占用4个字节对吧

为什么?因为指针,只是一个16进制的,4个字节的串,在32位系统下是这样的,他用来表示,一个变量,或者说一段数据的内存地址而已.

x86 是32位系统,32 /8 = 4 32位占4个字节

而32位系统的排列组合,可以是

32位操作系统最大能支持3.25G的内存容量


也就是负的2的32次方到 2的32次方-1 算下来,好像是4个G,但去掉操作系统还要占用一部分内存,就还剩3.25G了

?

?

如果我们用x64,64位去编译这个程序,可以看到这个时候

64 /8 =8 他会用8个字节来,表示一个地址.


因为在64位系统中,64个0101010,排列组合可以是

负的2的64次方 到2的64次方-1 的字节.

64位操作系统最大能支持128G的内存容量

也就是128G的内存.

?

所以我们就知道了在32位系统下,指针占用的内存是4个字节,在64位系统下指针占用的内存是8个字节.


?

然后我们再去看重要的地方

?

?

注意这个空指针,实际上就是个0可以看到

NULL 就表示0


int * p =NULL; 这里定义一个空指针.

?

注意我们不能给空指针赋值

*p =100; 是会报错的

?

可以看到报错了,为什么?

空指针的地址是0 如果是32位系统也就是 : 0000 0000 0000 0000 这个地址不用说,肯定已经被操作系统占用了,怎么可能会给你用..你一用系统还不得崩了

所以,空指针,就是不能用的指针.

?

?

?

然后我们再去看一种,野指针,野指针,就是有点儿野...

?

比如这里我们随便定义了一个指针

int * p =(int *)0x1100;

可以看到这里,我们随便定义了一个地址,0x1100;

?

然后我们如果去尝试,打印这个地址,指向的内容的话 *p

?

可以看到报错了.对吧


?.

?

为什么报错?

想想吧,这个地址,是咱们自己瞎写的,谁知道这个地址是什么程序在占用的,

不是我们自己申请的内存,如果允许我们,随便去查看,修改的话,那不乱套了,所以给你报错.














Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表