2015-05-11 144 views
1

我试图通过为自己阐明指针指向的地址,指针本身的地址和地址引用的值来理解简单指针。所以我写了一小段代码:(请不要纠正我,如果我在这里犯任何错误)声明指向指向指针的指针

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int a; 
    int *p; 
    int **pp; 

    a = 42; 

    /* Take the address of a */ 
    p = &a; 

    /* Take the address of p */ 
    pp = &p; 

    printf("Address of int &a:       %p\n\n", &a); 
    printf("value of a:         %d\n\n", a); 

    printf("Address where *p points to via (void *)p: %p\n\n", (void *)p); 
    printf("Value that *p points to via *p:    %d\n\n", *p); 
    printf("Address of *p itself via (void *)&p:  %p\n\n", (void *)&p); 

    printf("Address where **p points to via (void *)pp: %p\n\n", (void *)pp); 
    printf("Value that **pp points to via **pp:   %d\n\n", **pp); 
    printf("Address of **p itself via (void *)&pp:  %p\n\n", (void *)&pp); 
    return EXIT_SUCCESS; 
} 

这如预期的所有作品。现在,我想深入一层,并使用指向指针***ppp的指针的指针,并为其指定地址,指向指针pp的指针指向的地址为*p指向的地址为a。这是我以为我可以做到这一点:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int a; 
    int *p; 
    int **pp; 
    int **ppp; 

    a = 42; 

    /* Take the address of a */ 
    p = &a; 

    /* Take the address of p */ 
    pp = &p; 

    ppp = &pp; 

    printf("Address of int &a:        %p\n\n", &a); 
    printf("value of a:          %d\n\n", a); 

    printf("Address where *p points to via (void *)p:  %p\n\n", (void *)p); 
    printf("Value that *p points to via *p:     %d\n\n", *p); 
    printf("Address of *p itself via (void *)&p:    %p\n\n", (void *)&p); 

    printf("Address where **pp points to via (void *)pp:  %p\n\n", (void *)pp); 
    printf("Value that **pp points to via **pp:    %d\n\n", **pp); 
    printf("Address of **pp itself via (void *)&pp:   %p\n\n", (void *)&pp); 

    printf("Address where ***ppp points to via (void *)ppp: %p\n\n", (void *)ppp); 
    printf("Value that ***ppp points to via ***ppp:   %d\n\n", ***ppp); 
    printf("Address where ***ppp points to via (void *)&ppp: %p\n\n", (void *)&ppp); 

    return EXIT_SUCCESS; 
} 

但是,这给了我一个不兼容的指针警告。有人可以向我解释为什么这不起作用,如果拨打printf()是正确的?

+1

你得到的确切警告是什么,它是什么线? – interjay

+3

'int ** ppp;'应该是'int *** ppp;'。另外,'(void **)* ppp'不正确。它应该是'(void *)* ppp'。 –

+0

Da ** it。我应该留下以备日后参考或删除问题吗? –

回答

2

的问题是在这里:

int **ppp; 

这应该是

​​

因为它是现在你试图迫使三指针,为双指针。这将可能让你在这条线的错误:

ppp = &pp; 

此外你可能想看看this article :)的2号。

P.s. 如果您提供行号和特定错误,以备将来参考。人们可能想帮助你甚至更好:)

3

错误在这一行 int ** ppp;/*它应该是*** ppp,因为你指向一个指向另一个的指针*/