?
然后我们再来学这个指针,指针是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
?
可以看到报错了.对吧
?.
?
为什么报错?
想想吧,这个地址,是咱们自己瞎写的,谁知道这个地址是什么程序在占用的,
不是我们自己申请的内存,如果允许我们,随便去查看,修改的话,那不乱套了,所以给你报错.
本文暂时没有评论,来添加一个吧(●'◡'●)