C语言中变量和函数

今天我想写一下c语言中的变量和函数.其实以前也对这有所了解,但是今天我觉得才真正了解.(如果说的不对或者说的不够有深度请谅解).

每一个学过c语言的都知道变量和函数的.但是我以前对变量的认识就只有知道它的数据类型.其实在c语言中每一个变量和函数都有两个属性:数据类型和数据的存储类别.在讲这之前,先说说变量的分类.

根据变量的作用域不同可以将变量分为全局变量和局部变量.

局部变量:在函数内部定义的变量,它只在本函数范围内有效,也就是说只有在函数内才能使用它们,在此函数以外是不能使用这些变量的.这对大家都是很熟悉的,这里就不多说了.

全局变量:程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数.在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量也就是全局变量.注意:1.它的有效范围为从定义变量的位置开始到本源文件结束.例如:

intp=1,q=5; /*外部变量*/

float f1(int a)

{int b,c;

...

}

char c1,c2;  /*外部变量*/

char f2(int x,int y)

{int i,j;

......

}

main()

{int m,n;

....

}

p,q,c1,c2 都是全局变量,但是它们的作用范围不一样.在main函数和f2函数中可以使用全局变量p,q,c1,c2,但在函数f1中只能使用全局变量p,q,而不能使用c1和c2.

2.全局变量的作用是增加函数之间数据联系的渠道.由于同一个文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道.由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道.例如:

float Max=0,Min=0;

float average(float array[],int n)

{int i;

float aver ,sum=array[0];

Max=Min=array[0];

for(i=1;i

{if (array[i]>Max)Max=array[i];

else if (array[i]

sum=sum+array[i];

}

aver=sum/n;

return(aver);

}

main()

{float ave,score[10];

int i;

for(i=0;i<10;i++)

sacnf("%f",&score[i]);

ave=average(score,10);

printf("max=%6.2f\min=%6.2f\n",Max,Min,ave);

}

运行结果是:

99 45 97 100 67.5 89 92 66 43

max=100.00

min=43.00

aeverage=77.65

3.建议不在必要时不要使用全局变量,理由:

1).全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元.

2).它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量.如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去.但若该外部变量与其它文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性.

3).如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被"屏蔽",即他不起作用.

根据变量值存在的时间(生存期)可以分为静态存储方式和动态存储方式.

所谓静态存储方式是指在程序运行期间分配固定的存储空间的方式;动态存储方式是指在程序运行期间根据需要动态的分配存储空间的方式.内存中供用户使用的存储空间情况,这个存储空间分为3部分:程序区 静态存储区和动态存储区.

静态存储区主要存放的是全局变量,在程序开始执行的时候给全局变量分配存储区,程序执行完后就释放.在程序执行过程中它们占据固定的存储单元,而不是 动态的进行分配和释放.

在动态存储区中存放的主要是:①函数形式参数.在调用函数的时候给行参分配存储空间.②自动变量.③函数调用是的现场保护和返回地址等.这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间.

根据数据在内存中的存储方式,可分为静态存储方式和动态存储方式,具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern).下面分别做介绍:

⒈auto变量

函数中的局部变量,如果不做专门声明为static存储类别,都是动态的分配存储空间的.数据存储在动态存储区中.这类变量就是我们经常用到的变量,大家都很熟悉就不多做解释.

⒉static声明的变量

①用static声明局部变量

有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下次该函数调用时,改变量已有值,就是上一次函数调用结束时的值.这时就应该指定该局部变量为"静态局部变量",用关键字static进行声明.语法是:static 数据类型 变量名;

说明:

1.静态局部变量属于静态存储类别,在静态存储区内分配存储单元.在程序整个运行期间不释放.而自动变量属于动态存储类别,占动态区空间而不占静态存储区空间,函数调用结束后即释放空间.

2.对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值.以后每次调用函数是不再重新赋初值而只是保留上一次函数调用结束时的值;对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次就重新给一次初值,相当于执行一次赋值语句.

3.如在定义局部变量是不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量).而对自动变量来说,如果不赋初值则它的值是一个不确定的值.

4.虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能调用它.

例子:

int fac(in n)

{ static int f=1;

f=f*n;

return (f);

}

main()

{

int i;

for(i=1;1<=5;i++)

printf("%d! =%d\n",i,fac(i));

}

运行结果:

1!=1;2!=2;3!=6;4!=24;5!=120;

②用static声明全局变量

有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用.这时就可以在定义外部变量时加一个static声明.例

file1.c                   file2.c

static int A;            extern int A;

main()                   fun(int n)

{                           {

...

A=A*n;}

}

在file1.c中定义了一个全局变量A;但它用static声明,因此只能在本文件中使用,虽然在file2.c文件中用"extern int A;",但file2.c文件中无法使用file1.c中的全局变量A.

3.register变量

一般情况下,变量的值是存放在内存中的.当程序中用到那一个变量的值时,由控制器发出命令将内存中该变量的值送到运算器中.经过运算器运算后,如果需要寸数,再从运算器将数据送到内存存放.如果有一些变量使用频繁,则为存取变量要花很长的时间,为了提高效率,c语言允许将局部变量的值存放在cpu中的寄存器中,需要时直接从寄存器取出参加运算,不必到内存.这种变量编译系统自动根据使用情况识别,并自动改变.

4.用extern声明外部变量

如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束.如果在定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作"外部变量声明".表示该变量是一个已定义的外部变量.有了此声明,就可以从"声明"处起合法地使用该外部变量.例:

int max(int x,int y)

{int z;

z=x>y? x:y;

return(z);

}

main()

{extern int A,B;

printf("%d",max(A,B));

}

int A=13,B=-8;

结果是:

13

注意:用extern声明外部变量时,类型名可以写也可以省写.例如在上例中的"extern int A;"也可以写成:"extern A;"

****写到这里就不得不说说声明和定义的区别了.对于函数来说函数的声明是函数原型,而函数的定义是函数的本身.对函数的声明是放在声明部分中的,而函数的定义是显然不在声明的范围之内,他是一个独立的模块.

对变量来说声明就比较复杂,有二中情况:一种是需要建立存储空间的(int a),另一种是不需要建立存储空间的(extern a).前者称为"定义性声明"或者是定义.后者是引用性声明.广义地说,声明包含定义,但并非所有的声明都是定义.对"int a;"而言它既可以是声明,又是定义.而对"extern a;"而言,它是一个声明不是定义.一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明.*******

二:内部函数和外部函数

函数本质上是全局的,因为一个函数要被另外的函数使用,但是,也可以指定函数不能被其他文件调用.根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数.

内部函数:如果一个函数只能被本文件中的其他函数所调用,它称为内部函数.在定义时,在函数名和函数类型的前面加static.即

static 类型标识符 函数名(形参表)   例如:

static int fun (int a ,intb)

内部函数又叫做静态函数.使用内部函数,可以使函数只局限于所在文件,如果在不同文件中有同名的内部函数,互不干扰.

外部函数

⑴在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用.

如函数首部可以写成:

extern int fun(int a,int b)

这样fun函数就可以为其他文件调用.c语言规定:如果在定义函数时省略extern,则隐含为外部函数.

⑵在需要调用此函数的文件中,用extern声明所用的函数是外部函数.

c语言 申请变量函数,C语言中变量和函数相关推荐

  1. php mysql变量赋值给变量_MySQL_mysql 存储过程中变量的定义与赋值操作,一、变量的定义 mysql中变量定 - phpStudy...

    mysql 存储过程中变量的定义与赋值操作 一.变量的定义mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end 块中使用,变量必须定义在复合语句的开头,并 ...

  2. rectpuls函数 matlab,Matlab中的rectpuls函数解析

    Matlab中的rectpuls函数解析 Matlab中的rectpuls函数解析 1.先看Matlab中的解释: This MATLAB function returns a continuous, ...

  3. Oracle中to_char函数和MySQL中的str_to_date函数区别

    标题Oracle中to_char函数和MySQL中的str_to_date函数 1. str_to_date()----->相当于Oracle中的to_char(): 字符串转换为日期格式 (1 ...

  4. php mysql 变量赋值_mysql存储过程中变量的定义赋值操作

    一.变量的定义 mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end 块中使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量 ...

  5. 主成分分析函数Matlab,matlab中主成分分析的函数1

    princomp函数,pcacov函数,pcares函数,barttest matlab中主成分分析的函数 1. princomp函数 功能:主成分分析 格式:PC=princomp(X) [PC,S ...

  6. c语言函数 real,C ++中的real()函数

    这是在C ++中执行real()函数的任务. 此函数用于查找复数的实部.此函数返回复数的实部并将实部设置为值.而real返回实数部分.real()函数是头文件的函数. 在复数a + Bi中,Bi是虚数 ...

  7. c语言syscall函数,在C中调用syscall函数时出现问题

    为了完成家庭作业,我必须修改linux内核. 我在一个虚拟机上工作,我向内核添加了一个系统调用,我称之为get_unique_id.以下是get_unique_id.c的代码:#include #in ...

  8. python函数中变量的作用域_Python中变量的作用域(variable scope)

    此文目的 此文主要讨论和总结一下,Python中的变量的作用域(variable scope). 目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域: 以避免,在写代 ...

  9. python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解

    首先,先介绍两种引入模块的方法. 法一:将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二:只引入某个文件中一个类/函数/变量 ...

  10. python变量赋值方式_python中变量的命令规制及变量的赋值方式

    文章结构: 一.python中变量的命名规则 二.变量赋值的三种方式 三.python的垃圾回收机制 一.Python中变量的命令规则 变量名只能包含字母.数字和下划线,且不能以数字开头: 变量名不能 ...

最新文章

  1. PHP如何通过Http Post请求发送Json对象数据?
  2. 理解LSTM/RNN中的Attention机制
  3. 服务器高并发时请求报错_基于redis的分布式锁防止高并发重复请求
  4. [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
  5. Mac下文件的编码及修改编码
  6. python入门-简单的文件备份程序
  7. java 删除list_Java中如何优雅地删除List中的元素
  8. Leetcode每日一题:767.reorganize-string(重构字符串)
  9. 解决 mklink 使用中的各种坑(硬链接,软链接/符号链接,目录链接)
  10. 力扣-图解算法数据结构-剑指 Offer 05. 替换空格
  11. 剪枝乱炖 | 模型加速与压缩
  12. NPAPI:WINDOWS中,调用函数不能阻塞
  13. WebRTC服务器——Licode 环境搭建
  14. 0302 GDB调试走起【给PHP写插件】
  15. 电脑端微信用户图片DAT格式解码为图片
  16. 嵌入式系统架构设计师的理解
  17. 手机安装php7,php7.3编译安装时报错system libzip must be upgraded to version = 0.11
  18. 总结iPhone、iPad各机型对应的iOS 系统版本(最全)
  19. 李彦宏发布小度在家“解锁”中国家庭市场,被称作AI性价比之王
  20. Linux中select IO复用机制

热门文章

  1. 编写windows版ANE
  2. 05二项式系数Cnk.md
  3. 小酌重构系列[12]——去除上帝类
  4. 使用Comparator.comparing根据类的属性对list进行排序
  5. 细粒度的、安全高效的基于区块链数据溯源系统 Fine Grained, Secure and Efficient Data Provenance on Blockchain Systems(一)
  6. dmac学习之基于shadow register的multi block transfer
  7. opencv python 巡线 最小二乘法
  8. Json字符串的标准写法
  9. scikit-learn:4.3. Preprocessing data(standardi/normali/binari..zation、encoding、missing value)
  10. 没有投屏标志怎么投屏_没有【TV】小图标,手机怎么投屏电视