我有一个指针值存储在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;
答案 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;