理解指针。 *((char **)等于什么?

时间:2016-04-02 11:05:18

标签: c pointers

在C中,我有:

char *p, *q;
p = malloc(1);  //for the purpose testing only
p[0] = '!';
q = *((char **)p);
printf("p=%x q=%x\n", p, q);
printf("p=%c q=%c\n", p, q);

没有投射警告,输出为:

p=1a9008 q=21
p q=!

分配给q的表达式会发生什么,即*((char **)p)?作业后q的类型是否发生了变化?

编辑:我的代码中有错误。在尝试从代码片段中提取它时,我遇到了一个完全可用的示例,我错误地使用了char类型的示例值。在检查了更多原始代码之后,为p分配了一个指针值。所以p是指向指针的指针。

1 个答案:

答案 0 :(得分:2)

首先,变量的类型无法更改,如果它被声明为char* q,则其类型为char*

什么可以改变它的变量值,但在你的情况下,代码是完全错误的。

首先p被声明为指向char的指针,并且通过malloc分配单个字节,因此您将拥有类似

的内容
p = 0xDEADBEEF
        |
        ---> '!'

然后通过强制转换你强制p被认为是char**,所以指向一个指向char的指针,会发生什么是编译器被迫考虑

p = 0xDEADBEEF
        |
        -----> 0x??????21
                    |
                    --------> char

所以基本上你是强制手动分配和分配的内存被解释为内存地址,然后你将这个指针取消引用指针,这样*(char**)就会产生一个char* 0x??????21所以没有任何意义。