都说失败是成功之母,那成功呢?难道是失败之父?简直是谬论!
包不平在完成了对auto关键字的一顿猜想和实践后,已经对学习C语言不再恐惧了。可是,各位看官不要忘了,上面共有六个问题。中间四个问题姑且算是解决了。那么第一个和第六个呢?虽然,包不平已经知道怎么在C程序正确(姑且算正确)使用变量了,那么这么做的意义是什么呢?或者说第一个问题的答案是什么呢?在大学课本(谭浩强老师的C语言程序设计)中,这个操作叫做变量的定义。那定义的实际又是什么呢?看来只能通过实验来探究这个问题的实际了!
包不平抱着动手为王的心态在VC6.0中输入了下面几行代码:
int i=1;
Void main(void)
{
i= 2;
}
可是这一允许啥都看不到啊?难道用printf函数?printf打印出来的是值,怎么能反映出这个定义到底做了什么呢?好吧!没办法了,那就求助bing吧。嘿!还真别说,包不平还真找到了两个方法:用sizeof或者debug调试(里查看内存的)工具。“Sizeof又是神马?根本没见过呀!暂且还是使用debug工具吧!”包不平自言自语的毛病又犯了。通过一番折腾,他还真是找到了变量在内存中的变化。(在组建工具栏选择调试,接着在debug调试中选择Memory,然后输入&i,即取变量i的地址)OK!变量原来是存在内存中的啊!而且在定义后就有。那么,定义的作用应该就是把变量和内存关联起来了。具体是怎么关联的呢?这个就跟变量的数据类型以及修饰它的关键字有关了。例如,int数据类型的变量就是关联4个字节(1字节为4byte,1byte就是二进制的1位)的内存大小。
到这里,包不平突然想起如果说变量定义后会关联一段内存,那么函数呢?难道也会关联一段内存?另外,老师经常告诉我们如果函数很多,那么在定义函数之前应该来个声明。包不平三下五除二,就又来了一个程序:
int func(int i,int j);
int main(void)
{
return 0;
}
打开调试器后,包不平吃了一惊!“什么情况?在Memery中竟然取不了func函数的地址!”难道是要定义才能取地址?管他呢!先定义则个再说。他在第一行func的声明后面加上了下面的函数定义:
int func(int i,int j)
{
return0;
}
这回可以取func函数的地址了,不过貌似看不到地址指向的内存内容的变化啊!这是何解?
在Dev-C++里呢?我勒个去!竟然找不到这个工具。姑且不说是不是版本的问题,先看VC6.0的问题吧!包不平跑到网上用bing搜了一圈,发现找到的都是变量里面关于定义和声明的区别。管他呢,先动手验证一下再说。不过,说实话,不得不佩服他这股专研劲。整来整去,他得出下面几个结论:
1、 声明不关联内存,定义关联内存(注意不是分配,内存管理和映射由内核完成)
2、 使用外部定义时,要用extern关键字,还要包含该外部文件(且两个文件中不能同时包含main()函数)
想来想去,真是替声明委屈,不过又替它高兴。委屈的是,声明只是为定义喊了个口号,或者说发了个公告(当然是给编译器);高兴的是,声明在引用外部变量的时候却是必不可少的。
想到这里,包不平心中隐隐地有一股失落。他失落什么呢?也许没有人知道。也许有人知道。可是这重要么?过去的一切已经过去,一切不可重来,谁又能奈何?