数组访问:指针抽象还是固有属性?
在 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中文网其他相关文章!