我正在试图弄清楚如何增加指针指针以指向我想要的值。这本质上是一个指向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个电话。
答案 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()
内存时,这些指针前进会导致未定义的行为。这意味着它是分配的字节数或指向的当前地址。