一、内存
1.内存单元
为了有效的使用内存,把内存划分为一个个小的内存单元
;为了有效的访问的每个单元,就对内存单元进行了编号,这些编号就被称为内存单元的地址
。
2.内存地址
我们常说的32位与64位指的是32或64根地址线,地址线是物理的线,是实际存在可以通电的线,正电为1负电为0;
将电信号转换为数字信息,就能得到一组由0、1组成的二进制数;
在32位机中,我们把32根地址线产生的电信号情况全部罗列出来,可以得到232组二进制数,我们把这些二进制数称作内存的编号,而这些二进制编号就是我们所说的内存地址;
每一个地址对应一个内存单元,一个内存单元的大小是一个字节。
二、指针
1.指针变量
内存的地址编号实际上也是一个值,也需要有空间来存储,用来存放地址编号的就是指针变量,简单的来说指针就是地址。
指针是有类型的,我们声明一个指针变量的方式是数据类型* 指针名,其中数据类型说明了这个指针执行的对象是一个什么类型,*说明这是一个指针变量。
int main() { //a在内存中是要分配空间的 - 4字节 int a = 10; //定义一个指针变量pa,并将a的地址赋给pa //*说明pa是指针变量 //int 说明pa执行的对象是int类型的 int* pa = &a; //&是一个单目操作符,用来取地址 //%p专门用来打印地址 printf("a的地址是%p\n", &a); //*解引用操作, *pa就是通过pa里面的地址,找到a *pa = 20; printf("a的值:%d", a); return 0; }
1.指针大小
我们说了指针就是地址,而地址的本质就是一个值,那么这个值也是需要存储的,也就是说指针变量也是需要内存空间来存储的,那么一个指针的有多大呢?
//指针大小 int main() { printf("%d\n", sizeof(int*));//4 printf("%d\n", sizeof(char*));//4 printf("%d\n", sizeof(long*));//4 printf("%d\n", sizeof(long long*));//4 printf("%d\n", sizeof(double*));//4 printf("%d\n", sizeof(float*));//4 printf("%d\n", sizeof(short*));//4 }
指针占用多大空间,取决于地址的存储需要多大空间,而地址实际上就是一串二进制编号,所以无论什么类型的指针,大小都是一样的;
那么指针具体多大呢?其实这不难得出,我们每个二进制编号的长短实际上是由地址线的多少,32位机的地址线有32根,每根地址线对应一个二进制数,所以32位机的二进制编号长度为32,则32位机指针的大小是4字节。同理,64位机则是8个字节。