我想,大家都常常听人提及,C语言指针的重要性吧,但它重要在哪儿,你们有想过吗?
我们来看一个简单的例子:
int i = 256;
char *a = (char *)&i;
printf("%d,%d,%d,%d\n",*a,*(a+1),*(a+2),*(a+3));
这个例子输出的是 0,1,0,0 (32位及其以上操作系统下)
为什么会是这样一个结果呢?
变量 i 在内存中存储方式 00000000 00000001 00000000 00000000
变量 a 是一个 char 型的指针,我将它指向了 i 在内存中的开始位置,然后对这段内存进行读操作,每次读取 8 位
指针 内存数据 十进制值
a 00000000 0
a+1 00000001 1
a+2 00000000 0
a+3 00000000 0
这个例子很简单,但它却告诉了我们C语言指针重要性之所在----直接操作内存。直接操作内存有一个好处,实现数据储存与数据读取的完全分离。
C语言没有数据类型行吗?(指针除外)
答案是模拟两可的,行也不行。
一方面,C语言数据存储与读取是完全分离的,怎么写,怎么读,是你自己的事,完全可以不理会数据类型(前提是分配了足够的内存去存储数据 or 是在已存储数据的位置读取)。
另一方面,存储数据时,数据类型告诉系统,我要多大的内存空间;读取时,它又告诉系统,我要读多少位。如果没有这些数据类型,每次读写数据,都要手动告诉系统我要操作多少内存空间,如果指定的内存大小有一次错误,结果就可能完全不同。
我想你们一定还记得 void * 吧,他可以转换成任意类型的指针。为什么呢?因为 void * 指向了数据的存储位置,转换数据类型后,系统就知道了我要读写多大的内存,自然可行。另外值得提一下的是结构体,你可以把它看做是一大段内存空间,这一大段内存空间又分成了若干小块儿。
国际惯例,来个总结:
C语言数据类型转换只是改变每次读写内存的大小。