
指针
1内存
2 指针变量的大小
指针 1内存
谈到指针就离不开内存。先理解内存。
内存是电脑上非常重要的存储器,计算机中程序的运行都是在内存中进行的。
电脑的内存一般是4G,8G,16G,32G,内存的空间大小是如何使用的, *** 作系统把内存很好的使用了。
内存空间是如何管理,如何使用的?
注:硬盘和内存是两码事
像4G,8G这样的叫内存
像1T的这样的叫硬盘
变量是创建在内存中的,(在内存分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出地址变量如下:
#include
int main()
{
int a = 10;//一旦创建a,a要在内存中开辟空间的,a是一个整型,要占4个字节,
//而在内存中一个内存单元一个字节,即a要占4个内存单元,所以10在这4个内存单元的空间中存储着
//因为每个内存单元都有一个编号,a的地址是这4个编号中的第一个编号(第一个内存单元的地址)
&a;
//&——是取地址 *** 作符
//&a是取出a的地址,拿到a的地址
//注:这里a的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%pn", &a);
//打印地址,%p是以地址的形式打印
return 0;
}//运行结果是:00B1F8E0
即代码是:
#include
int main()
{
int a = 10;
printf("%pn", &a);
int * p = &a;
return 0;
}//打印的是a的地址:00EFFB334
//因为地址长,所以它用十六进制显示。以0X开头的数字是十六进制数字,以0开头的数字是八进制。
//若把取地址a(&a)也存起来,怎么存?(即是把a的地址存起来)
//则需创建变量p把a的地址存进去,p的类型是?
#include
int main()
{
int a = 10;
printf("%pn", &a);
int * p = &a;//p的类型是int*,此时p就是指针变量
char ch = "w";//假设一个叫ch的变量,类型是char,里面放的是一个w
&ch;//取地址ch,把这个地址若放到pc里去,
pc = &ch;//那怎么写pc的类型呢?
char * pc = &ch;
///运行结果是:4
//sizeof可以算变量大小,可以算类型大小
#include
int main()
{
printf("%dn", sizeof(char*));//计算字符指针类型的大小
printf("%dn", sizeof(short*));//计算字符指针类型的大小
printf("%dn", sizeof(int*));//计算字符指针类型的大小
printf("%dn", sizeof(long*));//计算字符指针类型的大小
printf("%dn", sizeof(float*));//计算字符指针类型的大小
printf("%dn", sizeof(double*));//计算字符指针类型的大小
return 0;
}//运行结果是:444444
//指针变量是用来存放地址的,指针变量有多大取决于地址存起来需要多大空间
//而地址需要多大空间又取决于地址是如何产生的?(即编号是如何产生的)地址是什么样的数据?
//以32位机器来说,叫32位机器是因为有32根地址线或说是数据线(有时候数据线和地址线是共用的)
//32根地址线是物理的电线,需要通电,通电之后就有了高电平和低电平,高电平和低电平属于电信号,电信号最后转化为数字信号机即1或0
//当32根地址线同时通电时,32根地址线如果都是低电平的话那么转化为数字信号就是32个0,00000000000000000000000000000000即32个二进制位,还可能是
//00000000000000000000000000000001、
//00000000000000000000000000000002、
//00000000000000000000000000000010、
//……
//10000000000000000000000000000000、
//10000000000000000000000000000001、
//……
//11111111111111111111111111111111、
//32根地址线如果电信号转化为数字信号的话,以上所有可能都会出现。
//那产生这样的二进制序列有什么用呢?是用来做为内存编号的,把
//地址线上产生的电信号转化为数字信号之后,我们就可以把这样的一个二进制序列作为一个个内存单元的编号,
//总共能产生2^32次方种这样的编号。
//(2^32次方的理解:因为2位二进制位能产生00、01、10、11这4种情况,
//3个二进制位有000、001、010、011、100、101、110、111这8种情况,即32位则有2^32次方种这样的二进制位。)
//我们就可以把这种二进制序列就可以做为内存的编号,即被称为地址。这样地址的二进制序列是由0或1组成的,有32个比特位
//32个0或1这样的二进制序列存起来的话给上32个比特位的空间就可以了,因为一个比特位上能存放一个1或者0,32个比特位就能存放这样的32个1或0组成的二进制序列。
//32个由0或1组成的二进制序列就是4个字节,即我们产生的这样一个地址数据,这样的一个二进制序列其实在存储时就只需要4个字节就可以了。
//即指针就是用来存放这4个字节的地址,所以指针变量的大小也只需要4个字节就可以了
能够产生2^32次方这样的地址,一个二进制序列管理一个内存单元(一个内存单元都有一个自己的编号)即这样的一个二进制序列管理着一个字节,2^32个地址也就能管理2^32次方个字节的空间,这个空间有多大呢?
(注:二进制里边的第33位,指的是它的权重是2^32次方,最低位的权重是2^0次方
HEX——十六进制
DEC——十进制
OCT——八进制
BIN——二进制)
2^32次方=4,294,967,296(十进制)
即如果是32位机器的话,能管理4,294,967,296个字节的空间,4,294,967,296除以1024换成Kb,再除以1024换成MB,再除以1024换成GB,即是4。
意味着32位机器能管理和使用的内存是4个GB。
最多能产生这么多的地址,所以最多能管理这么大的内存空间。
64位机器与此相似,但需要8个字节。
在32位环境下,指针的大小是4个字节;
在64位环境下,指针的大小是8个字节。
x86——表示的是32位程序,编译出来是32位的程序
x64——表示的是64位程序,编译出来是64位的程序
//指针变量的大小取决于地址的大小
// 32位平台下地址是32个bit位,即4个字节;
// 64位平台下地址是64个bit位,即8个字节。
平台指的是编译程序的位数,编译程序的位数取决于电脑(机器)位数
注:
内存中的一个内存单元的空间大小是一个字节;
而管理这一个内存单元需要一个编号(地址),这个编号所需要的空间大小是4个字节
32个二进制序列是一个地址,这个地址管理了一个字节,维护了一个字节,它是一个字节的编号。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)