C语言---变量与函数
一个C程序是由一个或多个程序模块组成的,每一个程序模块作为一个源程序文件,一个源程序文件是一个编译单元。
源程序文件分为库函数和用户自己定义的函数,以及有参函数、无参函数。
函数调用的过程:
1) 定义函数时指定的形参,未出现函数调用时,并不占存储单元,发生函数调用时,形参被分配临时空间。
2) 将实参对应的值传递给形参。
3) 执行子函数时,形参已经有值,可以直接调用,
4) 通过return将函数值返回给主函数。
5) 调用结束,形参单元被释放。
函数一般由两部分组成,声明部分和定义部分。声明放在主调函数的声明部分,定义部分是一个单独的模块。
对函数做声明的写法:
1) 函数类型 函数名(参数类型1 参数名1, 参数类型2 参数名2,...);
2) 函数类型 函数名(参数类型1, 参数类型2,...)
函数也可以调用本身,称为递归调用。
变量由局部变量和全局变量之分,函数也有内部函数和外部函数之分,默认的函数都是外部函数,因为定义
函数的目的就是被其他函数调用。
内部函数,通过static声明一个内部函数,只能被本文件中的其他函数所调用。内部函数又被称为静态函数。
通常把只需要被本文件使用的函数和变量,放在文件开头,外加static声明,来提高程序的可靠性。
外部函数,在定义时,加extern声明,C中也可以忽略,默认为外部函数。
关于函数的作用域,通过函数原型的声明,可以扩展函数的作用域,通过编译系统,该函数在本文件或其他文件中有定义。
扩展函数作用域的另一个主要的方式,#include<>
变量的定义分为两种,一种是需要建立储存空间的(int a)的定义性声明;
一种是不需要建立存储空间的(extern )的引用性声明;
从变量的作用域来看,变量分为全局变量和局部变量::
变量的定义,可能会有三种情况:
1) 在函数的开头定义;
2) 在某个复合语句中定义;
这两种定义方式定义的变量,称为局部变量。
在main中定义的变量,也只在main的函数中有效,其他的子函数中并看不到。
不同函数中可以使用相同的变量名,它们在内存中占用不同的单元。
形式参数也是一种局部变量,
3) 函数之外定义的变量,全局变量。
为了便于区分全局变量和局部变量,C语言中全局变量的首字母通常用大写来表示。
#include <stdio.h>
float Max=0, Min=0; //全局变量
int main{
}
从变量的生命周期来看,变量的存储方式也是不同,分为静态存储方式和动态存储方式。
一段程序分为程序区和数据区,数据区又分为静态存储区和动态存储区。
全局变量全部存放在静态存放区,非static的变量,函数形参都是动态存储方式。
每一个函数或者变量都有两个特性: 类型和存储方式
存储方式包括四大类:自动的auto,静态的static,寄存器的register,外部的extern
1)程序中的局部变量,不声明为static类型的,都是auto类型的,程序中多数变量属于此类。
auto int b,c; //显示声明变量的存储类型为auto类型,也可以忽略
//函数调用时,使用,函数执行结束后,释放空间
2)静态变量,在函数执行结束后,不会释放该空间,变量的值仍然存在。
static int c; //变量地址在静态存储区
如果定义的局部静态变量,没有赋值,编译时,自动赋值为0,或空字符"\0",只赋初值一次。
静态局部变量在函数调用结束后,还存在,但是并不能被其他函数引用。
static + 局部变量,变量分配到静态分配区,在整个程序执行过程中不释放,作用域只局限于当前函数。
static + 全局变量,变量的作用域只限于本文件模块中。
3)寄存器变量,不存储在内存中,而直接存放在CPU的寄存器中,不常用。
register int d;
4)extern主要用在将变量的作用域做扩展。本身全局变量的有效作用域,从定义处开始到文件结束,
在定义点之前的函数是不能使用该全局变量,使用extern关键字,可以扩展全局变量的作用域到该声明处。
1)从一个文件内扩展外部变量的作用域
int main() {
extern int A,B,C; //类型名int可以写,也可以不写
}
int A,B,C; //全局变量
2)将外部变量的作用域扩展到其他文件
file1.c
file A; //全局变量
int main() {
}
file2.c
extern A; //将file1中的变量扩展到本文件中。
int power() {
}
extern变量的声明和定义通常是分开的。
声明放在头文件.h中,extern int a;
定义放在c文件中, int a = 0;
3)将外部变量的作用域限制在本文件中。在全局变量前加static。声明只能用于本文件中的外部变量,静态外部变量
file1.c file2.c
static int A; extern A; //出错
int main() { void fun() {}
}
按变量的存放位置,可以分为:
1) 静态存储区, 静态局部变量(函数内部定义 static,变量一直存在,但是不能被其他函数访问)
静态外部变量(函数外定义 static,不能被其他的文件extern声明)
外部变量(函数外的全局变量,可以被其他函数extern声明)
全局变量,分为静态外部变量和非静态的外部变量。
2) 动态存储区,auto变量和形式参数
符号变量与const常量:
1)符号常量,通过编译预处理命令define定义, #define PI 3.1415
2)const变量,程序运行过程中不能被改变,在定义的时候,必须被初始化。 const int Max=1000;
符号变量在编译的时候,已经不存在,而const类型的变量是一直存在的,
符号变量的作用域从定义的位置开始,到源文件结束为止,而const变量的生命周期是与变量一样的,auto或static类型。
const类型的指针,
指向变量的指针,const <数据类型> *<指针变量名> 保证变量的值不变,但是变量的地址可变;
const int *p; const int a=15;
p = &a; //可以修改p中的值(指向变量的地址)
*p = 14; //非法不可以修改p中的值(地址)中的数据
指针常量,<数据类型> const *<指针变量名> 保证变量的地址不变,
int *const p = &a;
*p = 15; //合法。修改p所指向的变量的值
p = &b; //非法,不可以修改p中的值,即变量的地址不能变
在C的调试中,有一些内部定义的宏变量,__FILE__,__FUNCTION__,__LINE__来方便print的打印,调试。
C语言---变量与函数的更多相关文章
- C语言变量和函数命名规范
C 语言变量和函数命名规范: 关于C语言变量和函数命名规范 据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则.命名规则对软件产品而言并不是"成败悠关&quo ...
- C语言变量、函数的作用域及变量的存储方式
一.变量的作用域和存储方式 在C语言中每个变量都有两种基本属性:数据类型.数据的存储类别. 数据类型很多人都已熟知,例如:字符型(char).整型(int).浮点型(float)等等.存储类别是指数据 ...
- 模板语言变量,js变量,js自执行函数之前嵌套调用
1.模板语言变量 前端html页面中展示 {{ nodeIp }} 2.js变量引用模板语言变量 把模板语言变量传递给js,js去执行页面操作(变量的转换,只适用于字符串) var IP = &quo ...
- C语言---指针变量作为函数参数
在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...
- 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符
1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.C++对c语言register的增强 register关键字 ...
- C++语言对C的增强(1)——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符
1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.变量检测加强 在C语言中,重复定义多个同名的全局变量是合法的: ...
- C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...
- C语言指针变量作为函数参数
0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: #include <stdio.h> vo ...
- 一起talk C栗子吧(第一百二十三回:C语言实例--显示变量和函数的地址)
各位看官们,大家好,上一回中咱们说的是多线程的样例.这一回咱们说的样例是:显示变量和函数的地址. 闲话休提,言归正转.让我们一起talk C栗子吧! 在编敲代码时,有时候须要获取程序中变量和函数的地址 ...
随机推荐
- appium入门(1)__ appium介绍
摘自:http://www.testclass.net/appium/appium-base-summary/ 1.特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android ...
- quartz实现定时任务
一个定时的demo 引入maven依赖: <dependency> <groupId>org.quartz-scheduler</groupId> <arti ...
- bug:使用UIImageView+AFNetworking 图片不能正常显示的原因
今天调的东西涉及到图片加载,我刚看了下项目里以前导入了SDWebImage库,又发现整个就一个地方使用到了SDWebImage异步加载图片的方法,感觉占体积又鸡肋,干脆去掉,用UIImageView+ ...
- vivado SDK之找不到"platform.h"
解决方法:建工程的时候不要选择empty application,而是选择hello world,里面会自动包含platform.c,platform.h等. 另外,常用的xgpio.h头文件有时候 ...
- 认识程序的执行:从高级语言到二进制,以java为例
java 高级编程语言,面向对象*.java是源码文件*.class是字节码文件,一种中间文件. JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的 ...
- 前端 HTML 常用标签 head标签相关内容 style标签 定义内部样式表
styple标签 <!-- 定义内部样式表 --> <style type="text/css"></style>
- 003-JSR303校验
一.JSR303校验 1.1.概述 JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator. 此实现与 Hi ...
- NYOJ 食物链(WA)
1.WA代码 思路:预先分好3类,对每一行数据进行分类和真话假话判断 WA原因:前面某些行的数据 需要依赖 后面某些行给的数据 才能进行分类 初步改正思路( 对于前面给的无法直接分类的数据进行记录,等 ...
- [Shapefile C Library]读写shp图形(C++&.net Wapper)
ShapeLib的.net Wapper版可以在官网下载到,在WorldWind中也有使用.ORG据说也是使用的ShapeLib实现的shp文件的读写. 官网:http://shapelib.mapt ...
- MYSQL PROCEDURE 测试用例
/** * 查询俱协信息 */ DROP PROCEDURE IF EXISTS `get_club_list`; DELIMITER $$ CREATE PROCEDURE `get_club_li ...