一,内存和地址
内存被分为一个个单元,一个内存单元的大小是一个字节。
控制总线:发信息———要读取目标信息
地址总线:拿信息———拿取到目标信息
数据总线:传信息———从内存向CPU传信息
二,指针变量和地址
1,简单理解:
int main()
{
int a = 0;return 0;
}
表层意思:创建一个变量a,并赋值为10。
深层意思:在内存上申请4个内存的空间,存放10。
2,取地址:
int main()
{
int a = 10;
printf("%p", &a);return 0;
}
运行结果:
一个整型的大小为四个字节,每个字节都有它所对应的地址。但是打印整型地址时并不是四个字节都打印,而是只打印四个地址里的第一个地址(地址较小的那个)。
3,指针变量:
int *pa=&a;
* 说明pa是指针变量的意思int 说明pa指向的对象的类型是int类型
4,解引用操作符
地址有了,该怎么用?也就是说,有了变量(pa),该怎么用?
这样用:
int main()
{
int a = 10;
printf("%p\n", &a);
int* pa = &a;
*pa = 20;return 0;
}
*pa为解引用操作符,意思是:通过pa里面的地址找到它所指向的值,也就是a。也就是说,*pa就是a。
代码中*pa=20的意思就是a=20。
5,指针变量的大小
指针变量是专门来存放地址的,无论是什么,只要在指针变量里,它都是地址。
指针变量的大小有多大?取决于一个地址的存放需要多大的空间。
验证:
#include<stdio.h>
int main()
{
char* a = NULL;
int* b = NULL;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof(b));
return 0;
}
运行结果:
注:X86是32位机器,X64是64位机器
32位平台下地址是32个bit位,指针变量⼤⼩是4个字节64位平台下地址是64个bit位,指针变量⼤⼩是8个字节指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,大小都是相同的。