2014-02-28 65 views
3

我想将指针向前移动一个字节。 但我得到这个错误:将指针移动一个字节

lvalue required as increment operand 

有了这个代码:

int **test = 0; 
((char *) *test)++; 

但它是罚款与此:

int **test = 0; 
char **t2 = (char **) test; 
(*t2)++; 

我该怎么做后者简洁?

+0

可能重复的[如何使指针增加1个字节,而不是1个单元](http://stackoverflow.com/questions/16578054/how-to-make-a-pointer-increment-by-1-字节不是1单位) – Tacet

回答

2

尝试使用

(*(char **)test)++; 
+0

我试过了,它似乎工作。那么为什么需要首先投射到双指针呢? – donkon

+1

简单解释:您不能执行'5 ++;'或'(1 + 2)++;'或'calculate_pi()++;'。你只能增加一个变量('variable ++;')或者一个地址的值('(* something)++;')或者一个结构体的结构体的结构体('structure_variable.field ++;'或者'(* pointer_to_structure).field ++;'或'pointer_to_structure-> field ++;'。其他操作无效 – immibis

+0

所以,用你的例子:'(* something)++;'这意味着解引用是可以的,但是解引用和然后铸造然后递增不是? – donkon

2

如果你想增加值由双指针指向:

(* (char **) test)++; 

这意味着去refrence的双指针名为“test”,然后递增它当前指向的值。

这将增加指针指向的值,而不是提前指针本身。 这就是我认为你正在试图在你的示例代码中做的事情。

0

相反,接受的答案,我认为要做到这一点的唯一方法是:

int **test = 0; 
test = (int **)((char *)test + 1); 

与间接引用*任何表达式,如(*(char **)test)++,虽然它可能编译通常会给出一个分段错误,因为它正在访问内存位置0

+0

如果我在写入之前访问它,这是真的吗? – donkon