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

时间:2010-08-21 18:52:19

标签: 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]);
    }

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

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

对这一行感到困惑。

3 个答案:

答案 0 :(得分: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*

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*有助于强制执行该操作。

答案 1 :(得分:2)

names []被定义为指向chars的指针数组。因此,names [i]是指向名称中包含的第i个字符串的指针。 search_names []也是指向char的指针数组,因此search_names [i]也是指针。因此,不需要将地址运算符应用于names [i]以使search_names [i]指向与names [i]相同的字符串。希望这能为你澄清一切。

答案 2 :(得分:1)

所以你试图将数组名称复制到search_names中?请注意,name和search_names都是指向字符的指针。 IE,名称[i]是一个指针。

表达式

search_names[i] = names[i]

将search_names [i]的值指定为names [i]。这只是将地址&amp; names [i]的运行时堆栈上的内容放入地址&amp; search_names [i]的单元格中。在这种情况下,它只复制一个指针。它不会复制字符。它只会复制单元格名称[i]中的内容 - 指向一系列字符的第一个字符的指针。

原因

search_names[i] = names[i]++; 

相当于

search_names[i] = names[i]
在search_names的上下文中,

是因为增量运算符会影响names [i]的值。它在赋值运算符之后具有较低的优先级。因此表达式将在赋值后增加名称[i]。由于names [i]是一个指针,增量会做一些指针运算,这意味着它将指向地址(names [i] + sizeof(char))。

相关问题