2017-10-24 14 views
1

私はfctバイナリツリーのヘッダを削除しました。しかし、私は何の努力もしなかった、私はデバッガに依存していた。シンプルなポインタとダブルポインタの式

シンプルなポインタ、ダブルポインタ、値の関係を説明することはできますか?

Tree **P2,*P1,P; //(P consider it for explanation only) 
P1=&P2; 

//what type are these 
(*P2)->data; 
&(*P2)->data; 
P1->data; 
*P1->data; 

答えて

0

enter image description here 上記の図は、ポインタへのポインタのメモリ表現を示しています。第1ポインタptr1(あなたの場合は)は、第2ポインタptr2のアドレスを格納し、第2ポインタptr2(あなたの場合はP1)は変数のアドレスを格納します。

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

typedef struct _s { 
    int data; 
} Tree; 

int main(int argc, char *args[]) 
{ 

    /* 
    * Arrow operator example 
    * foo->bar is equivalent to (*foo).bar 
    * it gets the member called 'bar' from the struct that 'foo' points to. 
    */ 

    Tree **P2,*P1; 
    P1 = (Tree*)malloc(sizeof(Tree)); 
    P1->data = 789; 
    //P1=&P2;    // It's wrong, Incompatible pointer types Tree* and Tree*** 
    P2 = &P1;    // It's right, p2 points to address of p1 
    printf("%d\n", (*P2)->data);  // same as (**P2).data 
    printf("%p\n", (void*) &(*P2)->data); // same as &(**P2).data, (void* casting to print address) 
    printf("%d\n", P1->data);  // same as (*P1).data 
    //printf("%d",*P1->data);  // same as *(P1->data), it's already dereferenced type, you're trying to dereference again?? 
    free(P1); 


    return 0; 
} 
関連する問題