首页 > 解决方案 > 为什么我们使用两个间接运算符来访问字符串数组

问题描述

认为

char *p;
char a[] = "Hello";

p = a;

这里p的地址是a并且它指向字符串Hello的第一个元素

换句话说,我们需要一个间接运算符来访问字符串Hello的第一个元素

当我们有字符串数组时,为什么我们需要两个间接运算符,而数组只不过是一堆具有相同数据类型的内存位置

标签: c

解决方案


正如我认为你的意思,对于任何数组或指针 'a' 和索引i,表达式a[i]完全等于*(a + i).

这意味着 ega[0]等于*(a + 0)。和*(a + 0)等于*(a)哪个 等于*a

如果a是一个字符数组,如您的示例所示,那么*a确实是第一个元素的值。但是如果a是一个数组数组,比如

char a[2][4] = { "Foo", "Bar" };

then *ais仍然是 的第一个元素a,在这种情况下,它是另一个数组(包含字符串的数组"Foo")。并使用与上述相同的逻辑,因为*ais 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 *

所做的“取消引用”对于不同的指针意味着不同的事情。


推荐阅读