阿里云服务器建设网站,手游开服网,网站建设用免费素材,wordpress知更鸟模板内存
物理存储器和存储地址空间
物理存储器#xff1a;实际存在的具体存储器芯片。比如#xff1a;内存条、RAM芯片、ROM芯片。 存储地址空间#xff1a;对存储器编码的范围。
编码#xff1a;对每个物理存储单元#xff08;一个字节#xff09;分配一个号码寻址…内存
物理存储器和存储地址空间
物理存储器实际存在的具体存储器芯片。比如内存条、RAM芯片、ROM芯片。 存储地址空间对存储器编码的范围。
编码对每个物理存储单元一个字节分配一个号码寻址可以根据分配的号码找到相应的存储单元完成数据的读写
内存地址
将内存抽象成一个很大的一维字符数组。编码就是对内存的每一个字节分配一个32位或64位的编号与32位或者64位处理器相关。这个内存编号我们称之为内存地址。 内存中的每一个数据都会分配相应的地址char:占一个字节分配一个地址int: 占四个字节分配四个地址float、struct、函数、数组等
指针和指针变量 指针就是地址地址就是指针 int a;
int b[];
int* p;上述代码中a、和b和p都是地址也都是指针。 指针变量是存放地址的变量 通常我们叙述时会把指针变量简称为指针实际他们含义并不一样
指针的基础知识
指针变量的定义和使用
定义指针的方式如下 数据类型* 变量名 其中*表示该变量为指针变量数据类型表示该指针变量保存的是哪一种数据类型的地址也就是指针变量指向哪一种数据类型。
访问指针变量指向的内存空间的数据 *指针变量 此处的*为取值运算符。 指针变量保存的是内存地址*指针变量就表示访问该地址对应的内存空间。对*指针变量操作其实就是读写该内存空间的数据。
#includestdio.hint main() {int a 10;int* p;p a;printf(a %d\n, a);printf(p指向的数据%d\n, *p);printf(变量a的地址%p\n, a);printf(指针变量p存的地址%p\n, p);return 0;
}运行上面代码结果如下 注意可以取得一个变量在内存中的地址。但是不能取寄存器变量因为寄存器变量不在内存里而在CPU里面所以是没有地址的。
使用指针访问数据的原理 不同类型的数据在内存中占用不同的字节数指针变量保存的是数据首个字节的地址。系统根据指针变量保存的地址找到首个字节后再根据指针指向的数据类型顺位读取不同的字节长度从而访问到完整的数据。
比如一个int型变量a占4字节指针变量int* p只保存了a在内存中的首个字节的地址。当操作*p时系统会先根据该地址找到首个字节然后再顺位读取3个字节总共读取了4个字节从而取出变量a的值。
通过指针间接修改变量的值
#includestdio.hint main() {int a 10;int* p;p a;printf(a %d\n, a);printf(p指向的数据%d\n, *p);printf(变量a的地址%p\n, a);printf(指针变量p存的地址%p\n, p);*p *p 1;printf(p指向的数据加1后a %d\n, a);printf(p指向的数据加1后p指向的数据%d\n, *p);return 0;
}运行上面的代码结果如下 在定义指针类型时一定要和指向的变量类型是一样的才行。
#includestdio.hint main() {char a 97;int* p a;printf(a的值%d\n, a);printf(*p的值%d\n, *p);return 0;
}运行上面的代码结果如下 上面代码中虽然指针变量p保存的是字符变量a的地址但是p是指向int型数据的所以在找到a的地址后还会顺位读取3个字节的数据。
指针大小
windows中数据存储采用小端对齐的方式。也就是数据的低位放在地址小的内存中。 指针也是一种数据类型所以可以使用sizeof()测量指针的大小得到的总是4或8。 这是因为指针存储的是内存地址。在32位处理器中内存地址是一个32位的编号在64位处理器中内存地址是一个64位的编号。 所以在32位处理器中sizeof(指针)得到的总是4在64位处理器中sizeof(指针)得到的总是8。
在visio studio中可以在下图中选择基于32位或64位的处理器编译从而使sizeof(指针)得到不同的结果。
int main() {int* p1;int** p2;char* p3;char** p4;printf(sizeof(p1) %d\n, sizeof(p1));printf(sizeof(p2) %d\n, sizeof(p2));printf(sizeof(p3) %d\n, sizeof(p3));printf(sizeof(p4) %d\n, sizeof(p4));printf(sizeof(double *) %d\n, sizeof(double*));return 0;
}上述代码基于32位处理器编译运行后结果如下 上述代码基于64位处理器编译运行后结果如下
野指针和空指针
野指针
任意数值赋值给指针变量没有意义因为这样的指针就成了野指针此指针指向的区域是未知(操作系统可能不允许操作此指针指向的内存区域)。所以野指针不会直接引发错误操作野指针指向的内存区域可能会出问题。
int main() {int* p 100;/*操作系统将0255的内存空间作为系统占用不允许被访问操作*/printf(%d\n, *p);return 0;
}空指针
为了标志此指针变量没有指向任何变量(空闲可用)C语言中可以把NULL赋值给此指针这样就标志此指针为空指针。
int *p NULL;NULL是一个值为0的宏常量
#define NULL ((void *)0)空指针可用于条件判断 int* p NULL;if (p NULL) {printf(我是一个空指针\n);}else {printf(我不是一个空指针\n);}万能指针void *
万能指针可以接收任意数据类型的地址。但不能直接访问万能指针指向的内存空间因为系统找到数据的首个字节后不知道接下来要顺位读取多少个字节。
必须先将万能指针强转为某个具体类型的指针变量后才可以访问。
#includestdio.hint main() {int a 10;void* p a;printf(变量a的值%d\n, a);//printf(万能指针p指向的值%d\n, *p);//不能直接访问万能指针指向的内存空间printf(万能指针p指向的值%d\n, *(int*)p);*(int*)p *(int*)p 1;printf(加1后变量a的值%d\n, a);printf(加1后万能指针p指向的值%d\n, *(int*)p);return 0;
}执行上面代码结果如下
const修饰的指针变量
const 数据类型* 变量名const修饰数据类型说明该指针变量指向的内存空间可读不可写。
数据类型* const 变量名const修饰变量名说明该指针变量保存的内存地址可读不可写。
const 数据类型* const 变量名const既修饰数据类型又修饰变量名说明该指针变量指向的内存空间可读不可写保存的内存地址也是可读不可写的。
#includestdio.hint main() {const int a 10;//a 20;//errint b 20;const int* p a;printf(指针变量p指向的值%d\n,*p);//*p 30;//errp b;//okprintf(指针变量p指向的值%d\n, *p);int* const p2 a;printf(指针变量p2指向的值%d\n, *p2);//p2 b;//err*p2 30;//okprintf(指针变量p2指向的值%d\n, *p2);printf(a的值%d\n, a);const int* const p3 b;//*p3 40;//err//p3 a;//errprintf(指针变量p3指向的值%d\n, *p3);b 40;printf(指针变量p3指向的值%d\n, *p3);return 0;
}运行上面代码结果如下 const只能限定它所修饰的指针变量我们不能通过这个指针变量来修改指向的内存空间的数据或修改这个指针变量保存的内存地址。但是我们能通过其它指针变量来修改它们。
#includestdio.hint main() {int a 10;int b 20;const int* p a;//*p 20;//err 不能通过指针变量p改变a的值a 30;//okprintf(a的值%d\n, a);printf(*p的值%d\n, *p);const int* const p2 a;int** p3 p2;//*p2 20;//err 不能通过指针变量p2改变a的值//p2 b;//err 不能改变指针变量p2的指向即不能改变p2保存的内存地址**p3 40;//ok 通过指针变量p3改变a的值printf(通过指针变量p3改变a的值后a的值%d\n, a);printf(通过指针变量p3改变a的值后*p2的值%d\n, *p2);printf(通过指针变量p3改变a的值后, **p3的值%d\n, **p3);*p3 b;//ok 通过指针变量p3改变指针变量p2的指向printf(通过指针变量p3改变指针变量p2的指向后*p2的值%d\n, *p2);printf(通过指针变量p3改变指针变量p2的指向后, **p3的值%d\n, **p3);return 0;
}
运行上面的代码结果如下 文章转载自: http://www.morning.zkqjz.cn.gov.cn.zkqjz.cn http://www.morning.qbkw.cn.gov.cn.qbkw.cn http://www.morning.nwclg.cn.gov.cn.nwclg.cn http://www.morning.ntzbr.cn.gov.cn.ntzbr.cn http://www.morning.ghyfm.cn.gov.cn.ghyfm.cn http://www.morning.skrh.cn.gov.cn.skrh.cn http://www.morning.wfyqn.cn.gov.cn.wfyqn.cn http://www.morning.mgskc.cn.gov.cn.mgskc.cn http://www.morning.qfrsm.cn.gov.cn.qfrsm.cn http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn http://www.morning.qzbwmf.cn.gov.cn.qzbwmf.cn http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn http://www.morning.xqqcq.cn.gov.cn.xqqcq.cn http://www.morning.tpfny.cn.gov.cn.tpfny.cn http://www.morning.bzfwn.cn.gov.cn.bzfwn.cn http://www.morning.nfdty.cn.gov.cn.nfdty.cn http://www.morning.zmzdx.cn.gov.cn.zmzdx.cn http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn http://www.morning.ffydh.cn.gov.cn.ffydh.cn http://www.morning.rwbh.cn.gov.cn.rwbh.cn http://www.morning.fnwny.cn.gov.cn.fnwny.cn http://www.morning.djpzg.cn.gov.cn.djpzg.cn http://www.morning.jlrym.cn.gov.cn.jlrym.cn http://www.morning.qwrb.cn.gov.cn.qwrb.cn http://www.morning.drytb.cn.gov.cn.drytb.cn http://www.morning.ktbjk.cn.gov.cn.ktbjk.cn http://www.morning.qkgwx.cn.gov.cn.qkgwx.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.bfgbz.cn.gov.cn.bfgbz.cn http://www.morning.qwpdl.cn.gov.cn.qwpdl.cn http://www.morning.rzcfg.cn.gov.cn.rzcfg.cn http://www.morning.jqcrf.cn.gov.cn.jqcrf.cn http://www.morning.fsrtm.cn.gov.cn.fsrtm.cn http://www.morning.trtdg.cn.gov.cn.trtdg.cn http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn http://www.morning.lsqmb.cn.gov.cn.lsqmb.cn http://www.morning.psdsk.cn.gov.cn.psdsk.cn http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.dzqyn.cn.gov.cn.dzqyn.cn http://www.morning.hrpjx.cn.gov.cn.hrpjx.cn http://www.morning.hlnrj.cn.gov.cn.hlnrj.cn http://www.morning.ejknty.cn.gov.cn.ejknty.cn http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn http://www.morning.srgwr.cn.gov.cn.srgwr.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.cwcdr.cn.gov.cn.cwcdr.cn http://www.morning.btsls.cn.gov.cn.btsls.cn http://www.morning.zydr.cn.gov.cn.zydr.cn http://www.morning.rchsr.cn.gov.cn.rchsr.cn http://www.morning.nzcys.cn.gov.cn.nzcys.cn http://www.morning.mnlk.cn.gov.cn.mnlk.cn http://www.morning.hjrjy.cn.gov.cn.hjrjy.cn http://www.morning.fnmtc.cn.gov.cn.fnmtc.cn http://www.morning.cmldr.cn.gov.cn.cmldr.cn http://www.morning.zdzgf.cn.gov.cn.zdzgf.cn http://www.morning.lgmty.cn.gov.cn.lgmty.cn http://www.morning.fdrb.cn.gov.cn.fdrb.cn http://www.morning.yswxq.cn.gov.cn.yswxq.cn http://www.morning.pfkrw.cn.gov.cn.pfkrw.cn http://www.morning.qshxh.cn.gov.cn.qshxh.cn http://www.morning.smmrm.cn.gov.cn.smmrm.cn http://www.morning.gtwtk.cn.gov.cn.gtwtk.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.clpdm.cn.gov.cn.clpdm.cn http://www.morning.bphqd.cn.gov.cn.bphqd.cn http://www.morning.fbmrz.cn.gov.cn.fbmrz.cn http://www.morning.mrbzq.cn.gov.cn.mrbzq.cn http://www.morning.xfmzk.cn.gov.cn.xfmzk.cn http://www.morning.xxknq.cn.gov.cn.xxknq.cn http://www.morning.rttxx.cn.gov.cn.rttxx.cn http://www.morning.kntbk.cn.gov.cn.kntbk.cn http://www.morning.ghqyr.cn.gov.cn.ghqyr.cn http://www.morning.rltw.cn.gov.cn.rltw.cn http://www.morning.dhrbj.cn.gov.cn.dhrbj.cn http://www.morning.pfnwt.cn.gov.cn.pfnwt.cn http://www.morning.dlgjdg.cn.gov.cn.dlgjdg.cn http://www.morning.gagapp.cn.gov.cn.gagapp.cn http://www.morning.lpsjs.com.gov.cn.lpsjs.com