C语言一定要匹配指针类型

总是用合适的指针类型来装数据是个好主意。为了说明可能存在的陷阱,考虑下面的代码。将一个整数指针赋值给一个短整数指针:

int num = 2147483647;
int *pi = #
short *ps = (short*)pi;
printf("pi: %p Value(16): %x Value(10): %d\n", pi, *pi, *pi);
printf("ps: %p Value(16): %hx Value(10): %hd\n",
        ps, (unsigned short)*ps, (unsigned short)*ps);

这段代码的输出如下:

pi: 100 Value(16): 7fffffff Value(10): 2147483647
ps: 100 Value(16): ffff Value(10): -1

注意,看起来地址100处的第一个十六进制数字要么是7,要么是f,这取决于它是以整数还是短整数显示。这个明显的矛盾是在小字节序机器上运行代码的结果。图7-3说明了地址100处的常量的内存布局。

不匹配的指针类型

如果我们把它当做短整数,那就只用前两个字节,于是就得到了短整数值-1。如果我们把它当做整数,就会用4个字节,于是得到2 147 483 647。这类微妙的问题正是导致C和指针如此难的原因。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程