首页 > 后端开发 > C++ > C 和 C 中的数组和指针本质上是相同的吗?

C 和 C 中的数组和指针本质上是相同的吗?

Barbara Streisand
发布: 2024-12-13 20:28:18
原创
652 人浏览过

Are Arrays and Pointers Inherently the Same in C and C  ?

数组访问:指针抽象还是固有属性?

在 C 和 C 语言中,访问数组元素通常涉及使用指针。然而,这种行为背后的底层机制可能会令人困惑,从而导致数组和指针是否确实具有内在相关性的问题。

数组作为指针

与流行的相反相信,数组和指针在 C 和 C 中是不同的概念。本质上,数组表示保存相同数据类型的多个元素的连续内存块。另一方面,指针存储变量或数组元素的内存地址。

但是,C 语言规范引入了一个称为“数组表达式转换”的细微差别。当在某些上下文中不使用地址运算符 (&) 引用数组时,或者在字符串常量初始化中使用数组时,它们的表达式会转换为指针表达式。此转换将数组表达式转换为数组的“指向初始元素的指针”,模糊了数组和指针之间的界限。

表达式转换和指针算术

为了说明数组表达式转换的含义,请考虑以下假设的内存map:

Object           Address         Data
------           -------         -----
arr              0x10008000      { 0x00, 0x01, 0x02, 0x03 }
parr             0x10008014      0x10008000 (address of arr[0])
登录后复制

arr 是一个由四个整数组成的数组,而 parr 是指向 arr 第一个元素的指针。虽然 arr&arr 计算结果都相同的内存地址 (0x10008000),但它们具有不同的类型:数组与指向数组的指针。

指针算术变为此处相关。将 parr 增加 1 将其增加一个整数的大小(4 字节),正如指针所期望的那样。然而,递增 arr 会增加整个数组的大小(4 个整数或 16 个字节),突出显示其基础类型的固有差异。

可交换数组下标

C 数组表达式转换的另一个怪癖是它们的交换性。下标运算符 [] 可以应用于指针和数组,将它们视为等效的。例如,当 arr 为数组且 i 为一个整数。结论

虽然 C 中的数组表达式在某些上下文中可能表现得像指针,但了解它们的独特性质至关重要。数组代表连续的内存块,而指针存储地址。可交换下标和数组表达式转换提供了语法快捷方式,但不会改变这两个概念之间的根本区别。

以上是C 和 C 中的数组和指针本质上是相同的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板