2014-03-04 89 views
3

我编写了下面的程序来理解指针运算。第二个输出看起来很奇怪,因为指针'cp'被声明为const char **。如果没有任何投射,我认为当我做(cp + 1)而不是'8'时,它会增加'1',如输出所示。指针运算的奇怪结果

#include <stdio.h> 

typedef const char uint8_t; 

const char *c = "hello"; 
const char **cp = &c; 
const char ***cpp = &cp; 
const char ****cppp = &cpp; 

int main() { 

     printf(" cp  %p  (cp + 1) %p \n",(int*)cp, ((int*)cp)+1); 
     printf(" cp  %p  (cp + 1) %p \n", cp, (cp + 1)); 
     printf(" cp  %p  (cp + 1) %p \n", (uint8_t*)cp, ((uint8_t*)cp) + 1); 

     return 0; 
} 


cp  0x601020  (cp + 1) 0x601024 
cp  0x601020  (cp + 1) 0x601028 
cp  0x601020  (cp + 1) 0x601021 

回答

4

在没有任何铸造我期望[const char **]通过当我做(CP + 1)“1”,而不是“8”作为输出显示递增。

否 - 指针的指针将由指针的大小,你的系统上是8

3

没有任何造型我预计它会在“1”递增,当我做(CP + 1),而不是“8”作为输出显示。

您可能会认为,但你会错的。当增加一个指针时,增量的大小就是指针所指向的东西的大小,在这种情况下,这是8个字节(指针的大小)。

如果您想了一会儿,那比增加1个字节更有意义。如果你有一个指向数组的指针,无论这些指针是整数还是其他指针或结构,通过添加n可以获得数组中的n+1th项目是有用的。如果指针始终增加1个字节,则必须改写如下内容:p += (n * sizeof(MyStructType));。这样做在大多数情况下更难阅读,也更容易出错。另一方面,将指针指向结构的指针增加1个字节没有多大好处 - 这是导致错位错误的肯定方法。

+0

我对你的回答的第一部分,第二部分是模糊和不明确的同意递增。 – liv2hak