gpt4 book ai didi

c - 将指针分配给指向 char 的指针数组

转载 作者:太空狗 更新时间:2023-10-29 15:18:43 25 4
gpt4 key购买 nike

海湾合作委员会 4.4.4 c89

#define SIZE 5
char *names[SIZE] = {"peter", "lisa", "simon", "sarah", "julie"};
char *search_names[SIZE] = {0};
size_t i = 0;

for(i = 0; i < SIZE; i++ ) {
search_names[i] = names[i]++;
}

for(i = 0; i < SIZE; i++) {
printf("name to search for [ %s ]\n", search_names[i]);
}

我对这一行感到困惑 search_names[i] = names[i]++; 这是一个指向 char* 的指针数组。只是我的实验,我认为它应该是 &names[i]++。因为我想得到那个位置的指针。所以有了 & 会让我得到指针指向的地址。

我想我也可以这样递增:(names[i]) + i;

只是对那条线感到困惑。

最佳答案

names[i] 是一个指针,类型为 char*&names[i] 是指向 names[i] 的指针,因此类型为 char**。一些内存的图片:

names                    for each i, this is where names[i] *points*
|__________________ 0 1 2 3 4
| | | | | | |
| | v v v v v
[0 ][1 ][2 ][3 ][4 ] <gap> peter0lisa0simon0sarah0julie0
^
|_This is where &names[2] points, i.e. this is where names[2] *is*

name 是一个包含 5 个指针的数组,我用方括号及其索引描述了每个指针。加上一个空格,因为指针在我的机器上是 4 个字节。这是 names 初始化后的情况。右侧单独的内存块是一个字节序列,每个 0 表示一个 0/NUL 字节,而不是字符 0。为字符串文字分配内存是实现(编译器、链接器和加载器一起工作)的责任——我假设您使用的所有字符串文字都将聚集在一起,尽管情况不一定如此。最后,数字 0 ... 4 表示 names 中的每个指针指向的位置。

因为您要分配给 char*,所以您需要一个 char*。或者从另一个角度来看,当(且仅当)指针本身具有相同的值时,指针指向同一事物。因此,如果您希望 search_names[i](这是一个指针)指向 names[i] 所指向的同一事物,那么 search_names[i] = names[i] 完全正确。

虽然我不知道做 names[i]++ 的目的是什么。它修改指针 names[i]。修改指针使其指向不同的东西。在这种情况下,您最终会得到 names[0] 指向“eter”,names[1] 指向“isa”,等等。

这是在您递增 names 中的每个指针后内存的样子:

names                
|_____________ 0 1 2 3 4
| | | | | | |
v v v v v v v
[0][1][2][3][4] peter0lisa0simon0sarah0julie0

顺便说一句,您允许将字符串文字分配给char*,但这并不意味着您应该。最好声明数组 const char *names[SIZE]。修改编译器为字符串文字分配的内存是未定义的行为,使用 const char* 而不是 char* 有助于强制执行此操作。

关于c - 将指针分配给指向 char 的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538508/

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