gpt4 book ai didi

c - 为什么C中的char指针可以是char数组

转载 作者:行者123 更新时间:2023-11-30 20:39:52 25 4
gpt4 key购买 nike

在 C 中,您可以通过

声明一个 char 数组
char []array;

char *array;

后面一个是指针,为什么可以是数组?

最佳答案

指针和数组是两种完全不同的动物;指针不能是数组,数组也不能是指针。

这种困惑来自于大多数 C 语言介绍性文本中没有很好解释的两个概念。

首先是数组下标运算符[]可以应用于指针和数组表达式。表达式a[i]定义为*(a + i);您从存储在 a 中的地址偏移 i 元素,并取消引用结果。

所以如果你声明一个指针

T *p;

并将其分配给指向某些内存,就像这样

p = malloc( N * sizeof *p );

你会得到类似下面的内容:

        +---+
p: | | ---+
+---+ |
... |
+---+ |
p[0]: | |<---+
+---+
p[1]: | |
+---+
...
+---+
p[N-1]: | |
+---+

p 存储数组的基地址,因此 *(p + i) 为您提供存储在第 i 中的值该地址后面的元素(不是字节)。

但是,当你声明一个数组时,比如

T a[N];

你在内存中得到的内容如下:

        +---+
a[0]: | |
+---+
a[1]: | |
+---+
...
+---+
a[N-1]: | |
+---+

仅为数组元素本身预留存储空间;没有为名为 a 的变量留出单独的存储来存储数组的基地址。那么*(a+i)机制如何运作呢?

这给我们带来了第二个概念:除非它是 sizeof 或一元 & 运算符的操作数,或者是用于初始化另一个数组的字符串文字在声明中,“T 的 N 元素数组”类型的表达式将被转换(“衰减”)为“指向 T 的指针”类型的表达式”,表达式的值将是数组第一个元素的地址。

换句话说,当编译器在代码中看到表达式 a 时,它将用指向 a 第一个元素的指针替换该表达式,除非 asizeof 或一元 & 的操作数。因此,a 的计算结果为数组第一个元素的地址,这意味着 *(a + i) 将按预期工作。

因此,下标运算符对于指针和数组表达式的工作方式完全相同。然而,这并不意味着指针对象与数组对象是一样的;但事实并非如此,任何持相反观点的人都会感到困惑。

关于c - 为什么C中的char指针可以是char数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25671819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com