C语言发展过程中的小故事,C语言指针的小故事.docx
《C语言发展过程中的小故事,C语言指针的小故事.docx》由会员分享,可在线阅读,更多相关《C语言发展过程中的小故事,C语言指针的小故事.docx(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言发展过程中的小故事,C语言指针的小故事 楔子 初学者常闻到 指针乃C的精华。 那么指针终究妙在哪里 怎样去理解指针这个存在有些迫在眉睫 包括学习中都经常发现很多人以为自己真的懂指针 实际上你对指针理解多少呢 发现CSDN的MarkDown排版并不是很好 假如需要看本文的更佳版面 请戳这里 戳这里 开篇 从简单的开场 指针 你是怎样定义这个名词的存在呢 指针是一个变量 什么变量 指向一个内存地址的变量。 什么是内存地址 这是个深奥的概念 假如讲硬是要扯起来 要涉及的东西比拟多。 谭浩强的 ?C语言程序设计?中有这样一个例子(我记得是)。 我们把计算机比作一个旅馆 内存地址就是这个旅馆中的房
2、间的门牌号 而指针那么是一把唯一的能翻开相应房门的钥匙 (这是个有Bug的比喻 请看下面的 戏讲多级指针奇怪的房间问题 解释)。 这个解释的话对于普通的指针解释似乎是行的通的。 int nNum int* pNum nNum; 那么 nNum 就是一个房间了 而 pNum 就是对应的钥匙 我们要翻开房间只需要 简单的通过钥匙就能实现 而在 C 语言中这种实现是 *pNum。 那么我们就可以尝试一下了。 int nNum int* pNum nNum; if (*pNum nNum) printf( True else print( False 房间的大小(指针的区别到底在哪 ) 不得不讲的变量
3、类型 接下来我们开场考虑一个问题 房间的大小问题 我们知道旅馆的房间有大有小 有圆有方(应该没有圆的) 总而言之就是千奇百怪。 我们的变量也是如此 但是事实上并不是这样的哦。 就目前来讲 在 x86 环境下 笔者见过的变量类型本质上只有这么几种。 1 字节 简单的举例: char 2 字节 简单的举例: short int 4 字节 简单的举例: int,long (x86 下所有的指针都是 4 字节) 8 字节 简单的举例: double 有人或者许会讲 C语言不是还有 bool,额,有必要解释一下。 在 C99 中参加了 一个 _Bool 这个是目前在 VS2021 上可以直接使用的 C
4、语言 布尔型关键字。 还有一点就是 byte 并不是关键字。 指针从哪里来 通常我们是这样声明一个指针变量的 在一个根本的变量类型后面加上一个 * 例如 char* pChar; int* pInteger; float* pFloat; 通常我们是这样取出一个变量的地址的 在变量前面加上取地址符 int nNum; int* pNum nNum; 联想到的事情把钥匙变成房间 由于指针本身是一个 4字节的变量 那么我们是不是能用任意一个4字节变量来保存地址呢 也就是能不能把房间当做钥匙呢 int nNum; int npNum nNum; / 这里把一个 int 类型当做指针用所以变量命名为
5、npNum 我们写下如上的代码 测试之。发现编译器报出了一个警告 但是照旧可以编译通过。 警告 1 warning C4047: “初始化:“int与“int *的间接级别不同 根据警告的提示 再修改代码如下: int nNum; int npNum (int) nNum; / 这里把一个 int 类型当做指针用所以变量命名为 npNum 警告赫然消失了,我们试图输出一下. printf( 0x%X ,npNum); 我们再试一下这把新的钥匙能不能开门 printf( %d ,*npNum); 编译器给了我们一个脸色呢 错误 1 error C2100: 非法的间接寻址 好吧我们得到了一把没方
6、法开门的“钥匙 接下来我们讨论一下这把“钥匙为什么不能开门。 你知道么 房间是没方法翻开房间的。 由于我们上面已经试验了 房间是打不开房间的 所以我们需要把房间变回钥匙再去开门。 我们来变一下 void Demo_02() int nNum; int npNum (int) nNum; printf( %dn , *(int*)npNum); 结果告诉我们 成功的翻开了一扇新世界的大门 但是因为我们房间里面还没清理 所以一篇乱七八糟。 void Demo_02() int nNum / 整理一下房间 int npNum (int) nNum; printf( %dn , *(int*)npNu
7、m); 我们可以看到整理干净之后的房间里面住了 1 先生 1 请按任意键继续 糟糕了 256先生不见了 有一天 旅馆的管理员(我们)不小心把房间变成钥匙的经过搞错了。 void Demo_02() int nNum 256; / 整理一下房间 int npNum (int) nNum; int nSir256 *(char*)npNum; / 钥匙错了 printf( %dn , nSir256); 粗心的管理员把 本来是 int 的房间的钥匙给铸成了 char* 了。 翻开门之后 我们发现 房间干干净净 256 先生好似从来没有来过一样。 我们来看一张 int 房间内部的分布图1 | 厨房
8、| 卫生间| 厕所| 阳台 | 隔壁房间 . | 0x00 | 0x01 | 0x00 | 0x00 | 老王. 原来如此 我们因为钥匙铸错了 所以房间只剩下了一个厨房了。256 先生正在上厕所呢。 :) 我们设想 假如有一天 我们马虎的把 一个 char 房间的钥匙给铸成了一个 int* 隔壁的老王肯定不会饶了你 给你一个大大的脸色。 新的尝试 我们试着一开场就用上一些奇怪的钥匙。 void Demo_02() int nNum 256; / 整理一下房间 char* cpNum (char*) nNum; int nSirc *ncNum; printf( %dn , nSirc); 果然
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 发展过程 中的 故事 指针
限制150内