返回介绍

数组变量与指针又不完全相同

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

虽然可以将数组变量用作指针,但两者还是有一些区别,为了区分它们,考虑下面这段代码:

char s[] = "How big is it?";char *t = s;

sizeof (数组)是……数组的大小

sizeof (指针) 返回了 4 或 8,因为 4 和 8 分别是 32 位和 64 位操作系统上指针的大小。但如果对数组变量使用 sizeof ,C 语言就开窍了,它知道你想得到数组在存储器中的长度。

数组的地址……是数组的地址。

指针变量是一个用来保存存储器地址的变量,那数组变量呢?如果对数组变量使用

& 运算符,结果是数组变量本身。

当程序员写下&s 时,表示“数组 s 的地址是?”,数组 s 的地址就是……s ;但如果他写的是&t ,则表示“变量 t 的地址是?”。

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

当创建指针变量时,计算机会为它分配 4 或 8 字节的存储空间。但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的起始地址。

但是由于计算机没有为数组变量分配空间,也就不能把它指向其他地方。

指针退化数组变量和指针变量有一点小小的区别,所以把数组赋给指针时千万要小心。假如把数组赋给指针变量,指针变量只会包含数组的地址信息,而对数组的长度一无所知,相当于指针丢失了一些信息。我们把这种信息的丢失称为退化。只要把数组传递给函数,数组免不了退化为指针,但需要记清楚代码中有哪些地方发生过数组退化,因为它们会引发一些不易察觉的错误。

致命处方案件

这栋宅邸拥有他梦寐以求的一切:优美的风景,华丽的吊灯,独立盥洗室。豪宅的主人王百万因心脏病突发死在了花园中,享年 94 岁。自然死因?医生认为是服用心脏病药物过量。凉亭传来阵阵恶臭,但除了尸体的腐臭好像还有其他的味道。警察走出了大厅,走向王百万的 27 岁的遗孀,汤茱蒂。

“我想不通,他平时吃药时都很小心,这次怎么会……这张是服药的剂量单。”她将自动服药器的代码拿给他看。int doses[] = {1, 3, 2, 1000};

“警察说我改编了服药程序,但我对技术一窍不通。他们说是我写了这段代码,但我认为它不能编译,你说呢?”

她把修过指甲的手伸进钱包,递给了他一份程序。这段代码是警察在百万富翁的床旁边发现的,看起来的确无法编译……printf("服用 %i 毫克的药", 3[doses]);

表达式 3[doses] 是什么意思?3 又不是数组。汤茱蒂擤了擤鼻子,说道:“真的不是我写的,况且 3 毫克的剂量也不算太坏,你说呢?”

3 毫克的剂量杀不死那个老男人,但是真相其实近在眼前……

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

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

发布评论

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