最近遇到的问题很杂乱,没有一个鲜明的主题来写日志,只能以杂记的形式记录下来。以下分为几点:
(这是新浪博客的日志,现在开始在CSDN写了。)
1关于对C语言中数据类型的理解:
写程序时的数据类型的定以的本质是告诉编译器以多大的内存空间来存储数据,另一方面也方便程序员根据不同环境,来使用不同的数据类型。例如下面的语句:
int a=30;//1
char b=a;//2
char c=10;//3
char d=’4’;//4
上面是语句正确吗?能通过编译器么?在没有完全理解数据类型的本质时,可能还是很奇怪这样的写法,当理解了数据类型的本质后,这样写也是正确的。语句2是把整形的a赋值给char类型的b,这样是可以的。char类型占1字节,可以表示最大255这么大的数字,这里是把int类型的低8位赋值给了char b. b的值为30
如果a的值大于255,那么b的值就不等于a的值了,因为这已经超出了char能表示的数字范围。编译器会把前面高字节截断,只把低八位赋值给b,
例如:
int a=300;
char b=a;
printf(“b=%d\n”,b);
则:
b=44
语句3是把数字10赋给char c,其实可以把char 类型看成是一种特殊的int类型,只是要表示的数字范围要小些。char 类型的字符,也是有对应的ASCII码的嘛。语句4是把字符3赋给char d,字符3对应的ASCII 码为52。
2 关于对linux下,一切设备都文件的理解:
Linux中把所有设备看成文件,是为了统一的处理各种设备,把对设备的操作虚拟成对文件的简单读写操作,以操作文件的方式来操作设备。这样能方便管理,统一标准,仅此而已。这也是linux对设备处理的高明之处。屏蔽一切不同的细节,在上层应用就简单的以操作文件的形式就可以操作千差万别的设备了。
3 关于对函数调用的理解:
函数调用的实质时,程序的PC指针指向了函数定义的首地址,程序跳转到函数定义的地址去执行函数内部的处理,函数处理完成后又返回调用函数的地址继续执行。这也就解释了,为什么有些函数要处理全局变量,但是在调用函数的文件中根本就没有函数要处理的全局变量,但是编译器不报错,也能运行。那是因为程序已经跳转到了函数定义的地址开始执行,在函数定义的文件中肯定是有要处理的全局变量的定义的。函数调用的过程有点像中断的处理流程。个人认为可以把函数调用看成是一种软件上的特殊的中断。