声明(declaration)与定义(definition)
 
  为了使不同的文件都可以访问同一个变量,C会区  
 分变量的声明和定义。 
   
 
 
 
   
 变量的定义会为这个变量分配存储空间,并且 
 可能 
  会为其指定一个初始化的值, 
 一个变量的定义有且 仅有一处。 
 定义实际上是一种特殊的声明。 变量的声明会将变量的类型和名称传达给程序。当 然。我们可以通过使用“extern” 
 关键字来声明一个 变量,而不用定义它。声明的形式就是在变量的名 字和类型前面,加上关键字“extern”  
 。 
 
 
此处就得讲一下extern的用处了:
1、extern关键字用法一是用来声明一个变量的,告诉编译器我这个变量已经定义过了,但不一定在我这个声明前面,让编译器自己去找,如:

我在main函数后面定义的a变量,但是我能在main函数里使用a,而且打印结果是10,
2、 extern关键字用法二,用于声明在别的文件中已经定义好的变量,但是该变量不能是静态变量,通俗一点说就是,假设我有两个文件A和B,我在A文件中定义了变量sum,我想在B文件中使用,此时我可以在B文件中用extern声明一下sum,则可以用A文件中的变量sum
声明
 
   
 告诉程序一个变量或者函数已经被定义, 
 不会分配空间  
   
 可以被声明多次  
 
定义
 
  分配变量的空间  只能定义一次 
 
定义包含了声明,但是声明不包含定义,如
int a = 0;     //定义并声明了变量 a
extern int a;  //只是声明了有一个变量 a 存在,具体 a 在哪定义的,需要编译器编译的时候去找。 
二、高级声明
typedef int *apple与#define peach int *
 
  typedef是一种彻底的封装类型——在声明它之后不能 再往里面增加别的东西。 
 它和宏的区别体现在两个方面:  
 
 
  1、不能用其他类型说明符进行扩展。  
 
 
   
 unsigend apple j; // 
 这是非法的!  
 
 
   
 unsigned peach i; //  
 没问题, 
 i 
 是指向无符号整型变量的指针  
 
 
  2、在连续几个变量的 声明中,#define定义的类型不能 保证所有的变量为同种类型。  
 
 
   
 apple a, b; // a 
 和 
 b 
 都是指向整型变量的指针  
 
 
   
 peach c, d; // c 
 是整型变量指针, 
 d 
 是整型变量 
                


















