c - 为什么我们使用两个间接运算符来访问字符串数组
问题描述
认为
char *p;
char a[] = "Hello";
p = a;
这里p的地址是a并且它指向字符串Hello的第一个元素
换句话说,我们需要一个间接运算符来访问字符串Hello的第一个元素
当我们有字符串数组时,为什么我们需要两个间接运算符,而数组只不过是一堆具有相同数据类型的内存位置
解决方案
正如我认为你的意思,对于任何数组或指针 'a' 和索引i
,表达式a[i]
完全等于*(a + i)
.
这意味着 ega[0]
等于*(a + 0)
。和*(a + 0)
等于*(a)
哪个 等于*a
。
如果a
是一个字符数组,如您的示例所示,那么*a
确实是第一个元素的值。但是如果a
是一个数组数组,比如
char a[2][4] = { "Foo", "Bar" };
then *a
is仍然是 的第一个元素a
,在这种情况下,它是另一个数组(包含字符串的数组"Foo"
)。并使用与上述相同的逻辑,因为*a
is another array then**a
是该嵌套数组的第一个元素,在我的示例中是 letter 'F'
。
这就是为什么你需要“两个间接”来到达第一个数组的第一个字母。
哦,向后退,**a
(使用我的数组)变得等于a[0][0]
.
如果我们采用我们的数组数组
char a[2][4] = { "Foo", "Bar" };
并显示它在内存中的布局方式,就像这样(添加了指针):
+-----+-----+------+-----+-----+-----+---+-----+ | 'F' | 'o' | 'o' | 0 | 'B' | '一个' | 'r' | 0 | +-----+-----+------+-----+-----+-----+---+-----+ ^ ^ | | &a[0][0] &a[1][0] | | &a[0] &a[1] | &一个
如果我们采用指针&a
,它们都指向同一个位置&a[0]
。但它们不是同一类型!&a[0][0]
- 表达式
&a
是一个指向整个数组的指针a
,它的类型是char (*)[2][4]
- 表达式
&a[0]
是指向第一个子数组的指针,它的类型是char (*)[4]
- 而表达式
&a[0][0]
是指向第一个数组中第一个字符的指针,它的类型是char *
所做的“取消引用”对于不同的指针意味着不同的事情。
推荐阅读
- docker - 如何让 Jenkins 代理从 Artifactory 中提取其 Docker 映像?
- javascript - 来自 json 文件的图像未显示在网站上
- linux - Xinput 为我生成随机事件
- android - 小吃吧从右到左(自定义snackBar) Kotlin
- css - 有没有办法定位 img 标签对象位置 x 和 y?
- javascript - React-query / React-router dom 问题
- r - 包含数据的单个值的箱线图
- matlab - lratiotest 关于对数似然值的警告
- design-patterns - 在模块化单体中,在哪里绘制有界上下文线?
- javascript - 无法使用 fetch POST 将负数作为参数传递