(目录)
1.内存和地址
- 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的
- 所以为了有效的使用内存,就把内存划分成一个个小块,这每一个小块被称为内存单元,每个内存单元的大小是1个字节
- 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址,地址在C语言中也被称为指针,所以以后就可以通过地址找到对应的内存单元
接下来创建一个变量
a
:int a = 4
,int
类型占四个字节,所以a
在内存中占4个内存单元: 可以用&
对a
进行取地址:&a
,a
是一个整形变量,占用4个字节,每个字节都有自己的地址,这里取出的地址是第一个字节的地址(较小的地址)
所以这里&a
取出值的是0x0012ff44
2.指针变量的大小
通过一下代码就能得出指针变量的大小
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}
结论:<font color="#dd0000">指针大小在32位平台是4个字节,64位平台是8个字节</font> 以上结论是根据程序结果得到的,接下来我们也可以通过物理层面去得到指针变量大小:
对于32位机器,它有着32根地址线,每跟线在寻址的时候会产生高电压和低电压也就是1或者0,有着32根地址线,也就是地址有着32歌比特位,1字节等于8比特,所以32位机器中地址占4个字节 这里我们可以继续算下去:32根地址线,就有2的32次方个地址,
2^32Byte == 2^32/1024KB ==2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB
,所以在32位机器中,可以给4G的空间进行编址。
这里我们就明白:
- 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
- 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
总结:
- 指针变量是用来存放地址的,地址是唯一标示一个内存单元的
- 指针的大小在32位平台是4个字节,在64位平台是8个字节
3.指针类型的意义
指针有许多类型,如:int*
,short*
,char*
,float*
……
但是从前面得知指针的类型都是4或8字节大小,它们不会存在像如int
和char
不同类型有着不同占用空间的问题,既然指针类型大小一样,那么为什么不把指针设置成一个同一类型的指针并且可以接收不同的类型变量的地址呢?不同的指针类型都有什么意义呢?
意义1:指针访问权限的大小
首先看一下代码:
#include <stdio.h>
int main()
{
int a = 0x11223344;
int* pa = &a;
*pa = 0;
return 0;
}
调试后进入内存窗口,找到
标签:初阶,字节,int,地址,详解,内存,数组,指针 From: https://blog.51cto.com/u_16237630/7595320a
的地址后可以看见在内存中a
中的存储的值为:44332211
,这样“倒着存放”的原因是在Visual studio这个IDE中采取小端存储,如不懂大小端存储,