2012-12-22 136 views
0

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

'* pointer ++;'不会做你认为它做的事。 Furhtermore,你不需要手动乘以sizeof(* p)';指针算术和编译器为你解决这个问题。 – 2012-12-22 18:45:56

+0

'char * ptr = pointer + 5;'然后操作'ptr'? – fge

回答

2

如果您想通过5递增一个指针,简单地做到这一点:

pointer += 5; 

这在C罚款,这就是所谓的指针运算:编译器会找出指向对象的大小和将添加正确数量的可寻址单元。如果将指针大小乘以5,结果将不会与您期望的结果相符,如果平台上的指针大小为4,那么结果将是20而不是5的增量。

递增运算符不会用指针做任何魔术,你只是将它加入1

此外,你确定*pointer++真的做你的想法吗?增量的优先级高于解除引用运算符。这两种说法有同样的效果:

*pointer++; 

pointer++; 

在这两个语句指针会递增,在第一个,你也取消引用指针(旧值,因为增量为后缀),并采取它所指向的,不用它做任何事情。

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

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

+0

谢谢你。考虑一下之后,我意识到发生了什么问题,但我还是不太明白。问题是我正在递增'*指针++'而不是'指针++',这导致它设置'* pointer [0]'成为第五个指针,而不是像其他指针那样“敲掉”它,就像我想要的那样(当我去要打印'**指针',它会打印所有[0]改变而不是从[5]开始的元素)。我不明白的是'*指针++'和'指针++'在'char **指针'之间的区别如果你能很快解释这个我会很感激 –

+0

@randynewfield我加了一些关于它的东西。 – effeffe

1

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

+0

好点,角落案例+1 – effeffe