内存与我们现实生活中的空间类似,内存可以理解为一个大的空间,内存像小格子,并且给每个小格子编号。
思考:内存是怎么编号的?一个这样的内存单元是多大空间?
32位 - 32根地址线 - 物理线 - 通电 - 1/0
64位
电信号转换成数字信息:1和0组成的二进制序列
32位 产生2^32个二进制序列,都可以作为内存的编号,我们把这个编号成为内存地址
2的32次方个内存单元
假设:一个内存单元是1bit
最终:一个内存单元是一个字节byte,然后分配地址的
1.内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是
1
个字节
。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该
内存单元的地
址
。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:
#include <stdio.h>
int main (){int num = 10 ;& num ; // 取出 num 的地址// 注:这里 num 的 4 个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)printf ( "%p\n" , & num ); // 打印地址, %p 是以地址的形式打印return 0 ;}
num在内存中要分配空间的 - 4个字节 - sizeof()是C语言的内置运算符,以字节单位给出指定类型的大小。
那地址如何存储,需要定义指针变量。
#include<stdio.h>
int main()
{
int a = 10;//a在内存中要分配空间的 - 4个字节
printf("int占用 %d \n",sizeof(int)); -4个字节
//printf("\n");
printf("%p\n", &a);//%p 专门用来打印地址的
//pa = &a;//pa是用来存放地址的,在C语言中pa叫做指针变量
int * pa = &a;
//* 说明 pa 是指针变量
// int 说明pa执行的对象是 int 类型的
char ch = 'w';
char * pc = &ch;
return 0;
}
运行结果:
解引用操作:
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;//*解引用操作,*pa就是通过pa里边的地址找到a。
printf("%d\n", a);//打印出 20 ,原来a里面是10,现在是20,间接的改变a,将a的地址交给pa,pa解引用找到a,改变a。
return 0;
}
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'q';
printf("%c\n", ch); //打印结果 q
return 0;
}
指针就是地址,指针变量里面存储的就是地址,使用指针变量时其实就是使用的他的地址
2.指针变量的大小
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(long long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
return 0;
}
运行结果:
指针的大小是相同的!
为什么呢?
指针是用来存放地址的!
指针需要多大空间取决于地址的存储许要多大空间
32位 32bit - 4byte
64位 64bit - 8byte
结论
:指针大小在
32
位平台是
4
个字节,64位平台是
8
个字节。