2015-04-06 27 views
0

在賦值時我試圖改變一些東西,事情突然變得複雜得多,結果變得神祕。我不是故意弄髒代碼,我只是想比較差異,以幫助自己更好地理解。如何在C中的整數和單個字符賦值時理解指針?

#include <stdio.h> 

int main() { 

    int h = 10; 
    int *i = &h; 
    int j = &h; 
    int *k = h; 
    printf("%i;%p\n", h, &h); 
    printf("%p;%i;%p\n", i, *i, &i); 
    printf("%i;%p;%p\n", j, j, &j);  //how to print out h by j? 
    printf("%i;%p\n\n", k, &k);  // how to print out *k? 

    char a = 'M'; 
    char *b = &a; 
    char c = &a; 
    char *d = a; 
    printf("%c;%p\n", a, &a); 
    printf("%p;%c;%p\n",b, *b, &b); 
    printf("%c;%p;%p\n", c, c, &c);  //how to print out a by c? 
    printf("%c;%p\n", d, &d);  //how to print out *d? 

    return 0; 
} 

結果是:

10;0xbfcef838 
0xbfcef838;10;0xbfcef83c 
-1076955080;0xbfcef838;0xbfcef840 //where does -1076955080 come from? 
10;0xbfcef844 

M;0xbfcef836 
0xbfcef836;M;0xbfcef848 
6;0x36;0xbfcef837  //where does 6 come from? 
M;0xbfcef84c 
+1

閱讀關於指針解引用。 – haccks

+1

你不應該使用'%i'來打印soemthing的*地址*,它總是用十六進制表示地址。 – DrKoch

+0

'如何通過j打印出h?'假設int可以保存一個地址而不會丟失,你可以這樣做:'printf(「%d%d \ n」,h,*((int *)j)) ;' –

回答

1

您的代碼甚至不編譯(在ideone如C++,C大概警告)

int h = 10; 
int j = &h; 

無效。你的意思是

int h = 10; 
int *j = &h; 

這表示,j是一個指向一個int(int *j),它被初始化爲H(= &h)點;

要普林^ h用j

printf("%d\n", *j); 

認爲它這樣。 int *j表示*j是一個int。所以你必須輸入*j當你想要int指向的點數爲

+0

這沒有問題,我明白這應該是標準的方式,我只是好奇如果我改變一些東西,或許理解爲什麼會發生什麼,我相信它可以幫助我更好地理解C語言中的指針,同時加強調試技巧 –

+0

所以最新你的問題 – pm100

+0

我發佈了6個問題,所以我得到了2個答案,第1和第5 –