为什么我的字符串数组赋值不适用于指针?

why does my array of strings assignment not work with pointers?

提问人:programme3219873 提问时间:7/27/2022 更新时间:7/27/2022 访问量:56

问:

我有一个存储 5 个指针的结构char *

struct x {

       char *arr[5];
};

我使用 malloc() 为结构分配内存

struct x *str = malloc(sizeof(struct x));

但是,当我尝试使用值(即只读字符串文字)进行初始化时,它给了我一个错误arr

error: expected identifier before ‘(’ token
   13 |     (*str).(*(arr+0)) = "hello";
                   ^

这是我的初始化

(*str).(*(arr+0)) = "hello";

我知道我可以这样做

str->arr[0] = "hello"

但是我想了解字符串数组是如何工作的,所以我使用了指针,首先取消了引用并将其更改为 .str->(*str)

此外,由于在初始化中有效,并且我知道这相当于 where 是一个数组单元格,我虽然这在中有效,但事实并非如此。arr[0]str->arr[0] = "hello"arr[0]*(arr+i)i (*str).(*(arr+0)) = "hello";

为什么会这样,字符串数组实际上是如何在幕后工作的?

数组 C 指针 多维数组 取消引用

评论


答:

1赞 Vlad from Moscow 7/27/2022 #1

该结构具有数据成员 arr。

struct x {

       char *arr[5];
};

因此,您必须使用运算符或例如,编写访问数据成员.->

*( (*str).arr + 0) = "hello";

这与

*(*str).arr = "hello";

*str->arr = "hello";

str->arr[0] = "hello";

也就是说,成员访问运算符的定义如下

postfix-expression . identifier 
postfix-expression -> identifier

当您尝试使用不是标识符的表达式时。

使用您的方法来访问数组的 ant 元素,您可以编写

*( (*str).arr + i) = "hello";

*( str->arr + i) = "hello";

也就是说,首先您需要获得数组指示符,例如

( *str ).arr

str->arr

然后,您可以将指针算术与获得的数组一起使用。

评论

0赞 programme3219873 7/27/2022
在《你为什么要取消引用整个事情》中?据我了解,您访问结构体时,您可以使用它来访问数组的第 i 个元素。那么为什么要取消引用整个事情呢?*( (*str).arr + i) = "hello";(*str).arr+i
1赞 John Bode 7/27/2022
@programme3219873:表达式具有 类型 ,它“衰减”为 ;表达式具有 类型 ,它“衰减”为 。 与 不同,因此我们需要取消引用以匹配类型。为了每个人的理智,使用 和 运算符 - 比(*str).arr + ichar *[5]char **"hello"char [6]char *char **char *(*str).arr + i->[]str->arr[i]*((*str).arr + i)
0赞 Vlad from Moscow 7/27/2022
@programme3219873 你有一个指针数组。因此,表达式 ( *str ).arr + i 指向数组的第 i 个元素,类型为 char **。要获取指向的元素,您需要取消引用指针表达式,例如 *( (*str ).arr + i )。
0赞 Vlad from Moscow 7/27/2022
@JohnBode ( *str ).arr + i 的类型为 char **。