1

我试图弄清楚我将如何增加一个指针指针以指向我想要的值。这本质上是一个指向 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 个班轮。

4

2 回答 2

3

如果您想将指针递增5,只需执行以下操作:

pointer += 5;

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

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

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

*pointer++;

pointer++;

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

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

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

于 2012-12-22T18:51:06.757 回答
1

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

于 2012-12-22T19:04:07.147 回答