- 论坛徽章:
- 0
|
程序是为了解决问题而存在的,所有的程序都必须关注问题世界及其求解之道。
比如,问题是“三个苹果再加上两个苹果一共有多少个苹果”,在C语言代码世界中会将问题的求解抽象为 3 + 2 。
注意这里的3和2绝对不是与数学世界中的3和2。在C代码世界中的3和2都有自己的数据类型——int这样一种性质。它的本质含义是3和2都在int类型的表示范围之内,并且经过二元“+”运算后得到的结果依然在int类型的表示范围之内。C语言用类型表明了自己的“有限”责任、它的局限性及对问题的认识程度。它知道自己能但绝对不是无所不能。
和C以前的高级语言截然不同的是,C语言不但关心问题世界,它还有一种高贵的“宗教情怀”。它不但关心现世,还以一种哲学高度关心自己以后将要栖身的那个彼岸世界——内存。
为了知道数据对象(Object)在内存中的位置,C语言创立了指向对象的指针这样的概念。由于不同的Object都具有各自的长度,所以显而易见的是,单单只用一个内存地址描述是绝对不够充分的。对于
int i;
&i这个指针其实是通过存放i这个Object的起始地址和i的size共同描述i的位置的,两者缺一不可。
函数(function)完全不同于Object,函数并没有size这种性质需要刻画,但需要额外刻画参数个数、顺序、类型以及返回值类型。因此指向函数的指针与指向对象的指针是性质完全不同的指针。对于
void f(void){}
&f所描述的绝对不仅仅是f()函数的入口地址,还有其参数及返回值的性质或信息。
第三类指针void *则是一种无奈的权宜之计,因为有时无法整体传递指针的完整信息,这时候只好化整为零分别传递。例如
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
要想qsort()函数具有广泛的适用性,就只能分别处理指针具体的“值”及它所指向的对象的size。
|
|