内存
我们现实中,如果要找到一个地方,就需要一个地址
而在计算机内从中,我们会把内存分为许多小的空间,并给每个空间编上号
我们已知内存被分为许多小空间,那么就这么多内存空间而言
- 内存是怎么编号的呢?
- 一个这样的内存单元是多大空间呢?
- 内存是怎么编号的呢?
我们现实生活中的计算机有32位和64位的,对于32位计算机而言,就有32根地址线(物理),计算机可以对32根地址线通电,正电荷是1负电荷是0,最终产生了1/0这样的信号,将电信号转换成了数字信号,组成了0和1组成的二进制序列。
而这种二进制序列从:00000000 00000000 00000000 00000000
到:11111111 11111111 11111111 11111111
总共产生2的32次方个这样的二进制序列,这些序列都可以作为内存的编号
当这些二进制序列作为内存的编号时,我们把这些二进制序列称为内存的地址。
- 一个内存单元的空间是多大呢?
对于32位计算机而言,一共可以管理2的32次方个内存单元
假设:一个内存单元的大小是1bit
那么32位计算机可以管理2的32次方个bit的空间
2的32次方个bit的空间大小是512MB(0.5GB)
由此可看出来管理的空间太小了
我们最小的单位是char类型,都需要8bit,需要分8个地址,不太合适
所以最终一个内存单元是一个字节1byte
变量在内存中的存储
#include <stdio.h>
int main()
{
int a = 10;
printf("%p\n", &a);//打印出 a 的地址
return 0;
}
不管变量占用多少内存空间,我们只取出变量的首地址。
指针
变量地址的存放
当我们取出变量的地址后,我们需要指针变量来存放地址
变量类型* 指针变量名 就是指针变量的创建方法
变量类型是指针所指向的变量的数据类型,* 代表是指针变量
例如:
int a = 10;
int* pa = &a;
指针变量的使用
我们可以通过指针变量中存放的地址直接访问到变量
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;//解引用操作符 * ,*pa 就是通过 pa 中的地址找到 a 变量,然后将 a 的值改为 20
printf("a = %d\n", a);
return 0;
}
指针变量中存放的是地址,使用指针变量就是使用指针变量中存放的地址
指针变量的大小
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(long *));
printf("%d\n", sizeof(long long *));
printf("%d\n", sizeof(float *));
printf("%d\n", sizeof(double *));
return 0;
}
- 指针的大小为啥是相同的?
指针是用来存放地址的,指针有多大空间,取决于地址的存储需要多大空间
32位计算机:使用32个bit位组成的二进制序列来存放地址,32bit = 4 byte
64位计算机:使用64个bit位组成的二进制序列来存放地址,64bit = 8 byte
所以对于32位计算机,只需要 4 字节来存放地址,64位计算机,只需要 8 字节来存放地址。