关于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)*取值运算符
这篇关于关于C语言变量、指针与类型转换的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文