在给几年前的代码消除warning的时候。碰到一行奇怪的代码:
int m = (int)(((int *)p[0]) - '0'); //p是个char数组
warning只是提示类型转换的size不同,按道理删掉(int *)这个强制类型转换就ok了。
在改动之前先复现一下这行代码的效果,结果就发现了这个问题:
(int)(((int *)p[0]) - '0')输出并不等于(int)(p[0]) - '0'
当时认为可能是(int *)p[0]和p[0]值不一样,但是这个类型转化应该没有改变p[0]的值,打印出来结果也一样,实在是搞不懂。
相关的代码如下:
#include<stdio.h>
#include<stdlib.h>
void main()
{
char p[] ="123";
char s = '0';
// '1' - '0'
int m1 = (int)(((int *)p[0]) - s);
int m2 = (int)(p[0] - s);
printf("m1:%d , m2:%d\n",m1,m2);
m1 = (int)(int *)p[0] - (int)s;
printf("m1:%d\n",m1);
m1 = (int *)p[0] - (int *)s;
printf("m1:%d\n",m1);
return;
}
m1:-143 , m2:1
m1:1
m1:0
给s强行变成int*,结果反而变成0了,真是搞不懂,指针对我来说果然还是太难了...
具体我也不太懂,不知道这篇文章有没有用:
https://blog.csdn.net/zz460833359/article/details/47999775
((int *)p[0]) - s
=(int *)0x31-0x30
=(int *)(0x31-0x30*sizeof(int))
=(int *)(0x31-0xc0)=(int *)(-143);
(int)(p[0] - s)
=(int)(0x31-0x30)
=1
(int *)p[0] - (int *)s
=(int *)0x31-(int *)0x30
=(int)( (0x31-0x30)/sizeof(int) )
=(int)(1/4)
=0
你老老实实的把(int *)p[0]打印出来看到底是什么,不就知道了,为什么就不肯打印原始数据,非要打印运算结果