<C和指针---读书笔记3>

变量的作用域

     作用域分成:  代码块作用域,文件作用域,原型作用域,函数作用域。

代码块作用域:    { }里面的称为代码块,凡是在 代码块开始位置声明的变量都 具有代码块作用域,即可以在{ }里面访问。

文件作用域  声明于花括号外面的 变量都具有文件作用域。即在该文件内可以访问。

原型作用域:   是指那些函数原型中的声明。基本没啥施展的地方。  

函数作用域goto语句才有,希望永远不要用

这样看主要是理解:  代码块内核代码块外的区别。

链接属性

     当各个源文件被分别编译后,怎么才能访问调用别的文件里面的变量?

链接属性共有三种: 

分类

默认

用途

External

代码块外的变量和函数,均默认具有external属性

可以被其他文件引用

Internal

除非特别指定,默认不存在internal属性

使用static强制变为内部变量

None

除了代码块{}外,其余所有的都默认是none属性

--

External链接属性,是允许其他文件引用的,但是在使用前需要声明。而且要特别声明为 extern int a

              这是因为,源文件编译的时候,是一个一个文件检查语法的,如果使用前不声明,就会报语法错误

              特别声明为extern 类型,我理解是为了 明确告知程序员,这个变量的源在其他文件内。

             这里指出,函数不需要声明,也不要特别声明extern ,可以拿过来直接调用。(这个原因我还没理解。。。)

None属性: 默认情况下,代码块内的东西属于none属性。不过没啥意义

Internal属性:  在代码块外声明时,可以加上关键字 static,就会把 原本默认external属性的变量、函数强制变为internal。

仅供该文件内部使用。

存储类型

     变量有三个存储位置:  RAM、堆栈、register

分类

变量源

RAM

代码块外声明的变量都默认会存储在RAM,时钟保持。

不管前缀不缀static

堆栈

代码块内声明的变量默认会存储在堆栈中,随用随销毁

变量前缀static, 会把存储为变更到RAM中去

Register

需要特别指定,才会存在register

补充:

函数原型 &  函数原型声明  & 函数定义

在早期C语言中  ,调用函数之前,  需要声明函数名字、返回值信息,如  double  sqrt();   但是呢不声明参数列表。这样在实际使用中可能会  sqrt(10), sqrt(1.4,9)

 我们希望能规范的调用函数,当参数列表出现异常时,能警示我们。故而现代C中,函数原型声明,需要  返回值、函数名、参数列表类型声明。这样编译器在后续碰到调用情况时,

会自动的去判断 传参列表是否对应。  以上称之为 函数原型、及其声明。

函数定义:  函数定义是指,实现函数body。  如  int sqrt  ( int i)    { return  I * I }  

原文地址:https://www.cnblogs.com/mokang0421/p/7352675.html