问题遇到的现象和发生背景
在给几年前的代码消除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了,真是搞不懂,指针对我来说果然还是太难了...