初始C语言中(113)

初始C语言中(113),第1张

初始C语言中(1/13) 目录

指针

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个二进制序列是一个地址,这个地址管理了一个字节,维护了一个字节,它是一个字节的编号。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5504187.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-13

发表评论

登录后才能评论

评论列表(0条)

    保存