提问人:programme3219873 提问时间:7/27/2022 更新时间:7/27/2022 访问量:56
为什么我的字符串数组赋值不适用于指针?
why does my array of strings assignment not work with pointers?
问:
我有一个存储 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";
为什么会这样,字符串数组实际上是如何在幕后工作的?
答:
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 + i
char *[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 **。
评论