为什么使用指针的代码不使用b检索x的值?

mel*_*ony 2 c pointers

#include <stdio.h>
int main (){
int x=10,*a=&x;
int *b=(int *)&a;
printf("%d  %d  %d  %d  %d  %d  ",x,a,*a,b,*b,**b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这个小程序变量x中赋值10,然后将地址x分配给指针变量a.现在正确的方法是int **b=&a因为b应该是一个指向指针的指针.但我认为这最终是存储的地址.所以要存储a一个int指针的地址b,我使用类型转换int *b=(int *)&a.现在a存储的地址b.所以,如果我使用*b,它给出相同的结果a.

但是,当我进一步扩展到**b 它时,它没有给出*a我预期的相同结果.实际上它会出错.*b并且a是相同的,所以,当我问到这样从值获取**b*a这不起作用.为此,我认为一个概念,*ba在值相同,但他们在不同的类型.由a指针和值给出的值*b是一个整数,所以**b不可能像*a.

但我仍然认为它应该有效.

我使用的是Dev C++ 4.9.9.2,它是一个32位编译器.分配给int和的内存int *是相同的,即4个字节.并且*ba具有相同的位表示.所以当我写作时,*(*b)我使用了相同的值*(a).但是什么是预防因素?的格式是这样*(some bit representation),并且位表示是的情况下,相同的*ba.所以x应该检索价值.请解释预防因素.

aro*_*oth 5

一旦你的变量声明被清理了一下,它似乎对我很好:

int main (){
        int x = 10;
        int* a = &x;
        int** b = &a;
        printf("%d  %d  %d  %d  %d  %d  ",x,a,*a,b,*b,**b);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我建议问题是你b用错误的类型声明(然后&a转换为该类型).它不是int*,它是int**一个指向整数的指针.您当然可以*bprintf()语句中转换为所需类型,但为什么不首先正确声明它?

这是一个想法的例子:http://ideone.com/idwfd