关于C指针的最后一件事:混淆了这段代码会做什么?

时间:2011-10-18 06:11:04

标签: c pointers

我有一个指针值存储在b + 4,我想加载'a'。所以基本上我有b + 4是指向unsigned int(a指向的地址)的指针。但是,我想知道这段代码是否实际存储了整个'a'(因为'a'是4个字节),或者左手值只存储1个字节:

    void *a = //something;
    *((unsigned **)((char*)b+4)) = a;

我很困惑第二行是将'a'存储为char还是作为unsigned int ...

*编辑:那么,如果我这样做会有什么不同:

    *((char *)b + 4) = a;

2 个答案:

答案 0 :(得分:1)

  

*((unsigned **)((char *)b + 4))= a;

解析为指针 指针是一种类型,它只指向(存储)类型的地址(声明它的地址)。另请注意,系统上的所有指针都具有基本相同的大小。

所以在这种情况下,
b+4处的指针只指向/存储a存储的地址 你将有两个指向同一地址的指针。

    |----------|                                 
    |   b+4    |                            
    |          |  1000                       
    |   2000   |                             
    |----------|                               
          |                                           
          |
          |
          |
          -------------------->|----------|
                               |   num    |
          -------------------->|          |  2000
          |                    |    2     |  This is what a points to   
          |                    |----------|
          |
          |
    |----------|                             
    |     a    |                            
    |          |  3000                       
    |   2000   |                             
    |----------|    
  

*((char *)b + 4)= a;

不解析为指针类型,您正在尝试将指针指定给非指针类型,因此它应该发出警告。

答案 1 :(得分:1)

所有指针都有相同的大小。因此,RHS指向4字节变量并且LHS指向1字节变量无关紧要。重要的是,您在分配给LHS之前投了RHS。因此以下内容有效。

int c;
void * a = &c;

unsigned d;
unsigned * e = &d;
unsigned ** b = &e;
b = (unsigned **)&a;