增加指针的指针

时间:2012-12-22 18:42:54

标签: c pointers

我正在试图弄清楚如何增加指针指针以指向我想要的值。这本质上是一个指向cstrings的指针数组,我想将指针递增到指向xx指针。如果我想指向我可以做的第五个指针(指针被定义为char **pointer

,那么坚持我当前的应用程序
*pointer++;
*pointer++;
*pointer++;
*pointer++;
*pointer++;

,我现在将第五个指针设置为*pointer[0]我想要的。我正在寻找一种方法来清理它,希望是一个班轮。我尝试了不同的方法,但我还没有找到一个有效的解决方案。我的最后一次尝试是

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

但它不起作用。我认为如果我在系统上获得一个指针大小(4个字节)并将其乘以我想跳过的指针数,那么它将与发送*pointer++个电话的垃圾邮件做同样的事情。在我增加指针之后,我使用以下命令来打印其余的cstrings,直到满足指针数组的末尾。

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

总体而言,我需要帮助将5个*pointer++;电话转换为1个电话。

2 个答案:

答案 0 :(得分:3)

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

pointer += 5;

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

增量运算符不会对指针做任何魔术,你只需要向它添加1

此外,您确定*pointer++真的按照您的想法行事吗?增量的优先级高于解除引用运算符。这两个陈述具有相同的效果:

*pointer++;

pointer++;

在两个语句中,指针都会递增,在第一个指针中你也会取消引用指针(旧的值,因为增量是后缀)并取其指向的内容,而不对其执行任何操作。

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

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

答案 1 :(得分:1)

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