2015-04-06 24 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 –