指向指向char的指针数组的指针

ant*_*009 4 c pointers

gcc 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]);
    }
Run Code Online (Sandbox Code Playgroud)

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

我想我可以增加,以及类似这样的:(names[i]) + i;

只是对这条线感到困惑.

Ste*_*sop 7

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*
Run Code Online (Sandbox Code Playgroud)

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

既然你要分配给a 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
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你被允许分配一个字符串文字char*,但这并不意味着你应该.声明你的数组会更好const char *names[SIZE].修改编译器为字符串文字指定的内存是未定义的行为,使用const char*而不是char*帮助强制执行该操作.