首页 > 关于C语言变量、指针与类型转换的问题

关于C语言变量、指针与类型转换的问题

已知某虚拟机的代码片段如下:

//累加器和栈指针
int ax;
int *sp;

//栈
int *stack;

//初始化
const int poolsz = 256*1024;
stack = (int *)malloc(poolsz);
memset(stack, 0, poolsz);

sp = (int *)(stack + poolsz);

...

//问题所在
ax = *(char *)*sp++ = ax;

能告诉最后一个指针怎么理解吗?


ax = *(char *)*sp++ = ax;

首先忽略++

ax = *(char *)*sp= ax;

先看等式右边

char  *temp =  (char*)*sp;
将栈顶的元素 强制转换成char 类型的指针

*temp =  ax;
(即把栈顶元素当做地址,把ax存进去)

然后  sp++ 在看等式左边

ax  =  *temp

在把栈顶元素做地址,取出其值赋给ax 

这是我的测试用例

    int a = 0x12345678;
    int c = 0x87654321;
    int * p[] = {&a, &c};
    int **sp;
    sp = p;
    int ax = 0xaaaaaaaa;

    ax = *(char *)*sp++ = ax;
    printf("%x   %x     %x ",a , c, ax);
    /* a = 0x123456aa
       c = 0x87654321 (不变)
       ax = 0xffffffaa( ax高位被截断)
     */

关于c语言的结合性

根据操作符优先级 和 结合方向

你的例子中包含三个操作符 ,他们的结合性是从右到左
(1)++ 自增运算符
(2)(char *)强制类型转换
(3)*取值运算符

【热门文章】
【热门文章】