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

查看:371
本文介绍了关于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)*取值运算符

这篇关于关于C语言变量、指针与类型转换的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆