【问题标题】:Incrementing pointers of pointers指针的递增指针
【发布时间】:2012-12-22 18:42:53
【问题描述】:

我试图弄清楚我将如何增加一个指针指针以指向我想要的值。这本质上是一个指向 cstrings 的指针数组,我想增加指针以指向 xx 指针。为了坚持我当前的应用程序,如果我想指向我可以做的第五个指针(指针定义为char **pointer

*pointer++;
*pointer++;
*pointer++;
*pointer++;
*pointer++;

它现在将第五个指针设置为我想要的*pointer[0]。我只是在寻找一种方法来把它清理成一个 1 班轮。我尝试了不同的方法来解决这个问题,但我还没有找到一个可行的解决方案。我最后一次尝试是

*pointer += (sizeof(pointer) * 5);

但它不起作用。我认为如果我在系统上获得一个指针的大小(4 个字节)并将其乘以我希望跳过的指针的数量,它会做与*pointer++ 调用的垃圾邮件相同的事情。在我增加我的指针后,我使用以下内容打印其余的 cstrings,直到遇到指针数组的末尾。

while(*pointer[0])
{
   printf("data: %s\n", *pointer);
   pointer++;
}

总的来说,我需要帮助将 5 个 *pointer++; 电话变成 1 个班轮。

【问题讨论】:

  • *pointer++; 不会像您认为的那样做。此外,您无需手动乘以sizeof(*p);指针算术和编译器会为你解决这个问题。
  • char *ptr = pointer + 5; 然后操纵ptr 呢?

标签: c pointers


【解决方案1】:

如果您想将指针增加5,只需这样做:

pointer += 5;

这在 C 中很好,它被称为 指针算法:编译器将计算出指向对象的大小并添加正确数量的可寻址单元。如果将5 乘以指针的大小,结果将不是您所期望的,如果在您的平台上指针的大小是4,那么结果将增加20 而不是5

增量运算符对指针没有任何作用,您只需将1 添加到它。

此外,你确定*pointer++ 真的如你所想吗?增量的优先级高于取消引用运算符。这两个语句具有相同的效果:

*pointer++;

pointer++;

在两个语句中指针都递增,在第一个语句中,您还取消引用指针(旧值,因为增量是后缀)并获取它指向的内容,而不用做任何事情。

如果你在表达式中使用它们,它们会给你两个不同的东西:如果pointer 的类型为char **(假设它是一个字符串数组),*pointer++ 给你第一个字符串作为指向它的第一个字符串的指针字符然后增加pointer,而pointer++的结果仍然是char **,并且简单地返回pointer本身然后增加pointer。请注意,在这两种情况下,您都会丢失第一个字符串。

我看到linux标签:你不用考虑这里的平台,这是可移植的。

【讨论】:

  • 谢谢你。再想一想之后,我意识到出了什么问题,但我还是不太明白。问题是我增加了*pointer++ 而不是pointer++ 这导致它设置*pointer[0] 成为第五个指针而不是像我想要的那样“敲掉”它之前的其他指针(当我去打印@987654342 @ 它将打印所有更改了 [0] 的元素,而不是从 [5] 开始)。我不明白的是char **pointer*pointer++pointer++ 之间的区别,如果您能快速解释一下,我将不胜感激
  • @randynewfield 我添加了一些关于它的内容。
【解决方案2】:

如果你有一个TYPE* 类型的指针pointer 并且你添加了N,那么指针将前进N * sizeof (*pointer) 或等效的N * sizeof(TYPE) 字节。由于您没有提到内存是否是动态分配的,因此当您尝试free() 内存时,这些指针前进后会导致未定义的行为。这意味着它也是分配的字节数或当前地址指向。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多