2

我试图了解指针递增和取消引用是如何结合在一起的,我这样做是为了尝试一下:

#include <stdio.h>
int main(int argc, char *argv[])
{
    char *words[] = {"word1","word2"};
    printf("%p\n",words);
    printf("%s\n",*words++);
    printf("%p\n",words);
    return 0;
}

我希望这段代码能够执行以下操作之一:

  1. 先解引用再增加指针(打印word1)
  2. 首先取消引用然后增加值(打印 ord1)
  3. 取消引用指针 + 1(打印 word2)

但是编译器甚至不会编译它,并给出这个错误:lvalue required as increment operand我在这里做错了吗?

4

4 回答 4

2

您需要在第二个 printf 中的指针取消引用周围加上大括号,例如:printf("%s\n",(*words)++);另外,如果您试图在列表中获取数字 2,则需要使用前缀增量而不是后缀。

于 2012-04-14T02:16:08.320 回答
2

您不能递增数组,但可以递增指针。如果您将声明的数组转换为指针,您将使其工作:

#include <stdio.h>
int main(int argc, char *argv[])
{
    const char *ww[] = {"word1","word2"};
    const char **words = ww;
    printf("%p\n",words);
    printf("%s\n",*words++);
    printf("%p\n",words);
    return 0;
}
于 2012-04-14T02:21:13.233 回答
1

words是数组的名称,因此++没有任何意义。但是,您可以使用指向数组元素的指针:

for (char ** p = words; p != words + 2; ++p)
{
    printf("Address: %p, value: '%s'\n", (void*)(p), *p);
}

你当然2可以使用更通用的sizeof(words)/sizeof(*words).

于 2012-04-14T02:18:51.810 回答
0

问题在于这一行:

printf("%s\n",*words++);

它被读取为*(words++),即增加一个内存块。这没有意义,这有点像尝试这样做:

int a = 1;
(&a)++; // move a so that it points to the next address

这在 C 中是非法的。

问题是由C中的数组和指针之间的区别引起的:(基本上)数组是一块内存(在编译时分配),而指针是指向一块内存的指针(不一定在编译时分配) . 使用 C 时这是一个常见的问题,关于它还有其他问题(例如C:char 指针和数组之间的区别)。

(其他答案中描述了该修复程序,但基本上您希望使用指向字符串的指针而不是字符串数组。)

于 2012-04-14T02:33:28.467 回答