返回介绍

为什么指针有类型

发布于 2024-10-10 23:21:23 字数 2234 浏览 0 评论 0 收藏 0

既然指针只是地址,为什么指针变量有类型?为什么不能用一种通用类型的变量保存所有的指针?

因为指针算术运算会暗渡陈仓。如果对

char 指针加 1,指针会指向存储器中下一个地址,那是因为 char 就占 1 字节。

如果是 int 指针呢?int 通常占 4 字节,如果对 int 指针加 1,编译后的代码就会对存储器地址加 4。int nums[] = {1, 2, 3};printf("nums 的地址是 %p\n", nums);printf("nums + 1 的地址是 %p\n", nums + 1);


如果运行上面这段代码,就会发现两个地址相隔不止一个字节。指针之所以有类型,是因为编译器在指针算术运算时需要知道加几。

 

致命处方案件

上次我们把大英雄留在案发现场调查汤茱蒂,她的丈夫因一段可疑的代码而服用药物过量致死。汤茱蒂到底是写代码的杀人凶手,还是无辜的替罪羊?如果你想知道真相,接着往下读……

他把代码塞进了口袋,说道:“王太太,谢谢你的配合,以后我再也不会打扰你了。”他握了握她的手。“谢谢。”她一边拭去眼角的泪水,一边说道,“你真是个好人。”

“先别急,王太太。”还没等汤茱蒂反应过来,他就已经给她戴上了手铐,“看到你那双精心修饰过的手,我就知道你隐瞒了很多真相。”只有一个以键盘为生的人,指尖才会像她那样布满老茧。

“汤茱蒂,你假装对 C 语言一窍不通,但事实上,你是一个高手,让我们再看一遍代码。”int doses[] = {1, 3, 2, 1000};printf("服用 %i 毫克的药", 3[doses]);

“看到 3[doses] 这个表达式的时候,我就知道有哪里不对劲,你知道数组变量 doses 用作指针,那剂致命的 1000 毫克可以写成这样……”他在一张“舒洁”纸巾上写下一些代码。doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]

“王太太,你的代码彻底出卖了你,它给王百万服用了 1000 毫克的药。现在我们要带你去一个地方,在那里你再也无法玩弄 C 语言的语法……”

要点

数组变量可以用作指针……
……但数组变量和指针又不完全相同。
对数组变量和指针变量使用

sizeof ,效果不同。

数组变量不能指向其他地方。

把数组变量传给指针,会发生退化。

索引的本质是指针算术运算,所以数组从 0 开始。

指针变量具有类型,这样就能调整指针算术运算。

 这里没有蠢问题问:我真的需要理解指针算术运算吗?答:有的程序员不使用指针算术运算,因为它很容易出错,但你可以用它有效地处理数组数据。问:指针能做减法吗?答:能,但小心别让指针越过数组的起点。问:C 语言什么时候对指针算术运算进行调整?答:在编译器生成可执行文件时,编译器会根据变量的类型,用变量的大小乘以指针的增量或减量。问:然后呢?答:假如编译器看到你对一个指向 int 数组的指针加 2,就会用 2 乘以 4(int 的长度),然后对地址加 8。问:C 语言在调整指针算术运算时用了 sizeof 运算符吗?答:本质上如此,sizeof 运算符的结果也是在编译时决定的,对各种数据类型,sizeof 和指针算术运算都将使用相同的长度。问:指针可以相乘吗?答:不可以。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文