函数的定义、说明与调用 1函数的定义、说明与调用 (一)无参函数的定义形式 类型标识符 函数名() 函数体(包括声明部分和执行部分) 例: printf(“*******n”); (二)有参函数定义的一般形 型标识符 函数名(形式参数表) 函数体(包括声明部分和执行部分) (三)一个函数可以是空函数 如 dummy(){} 要正确实现函数间的相互调用需满足下列条件 第一,被调用函数必须存在且允许调用
函数的定义、说明与调用 4 . 1 函数的定义、说明与调用 (一)无参函数的定义形式 类型标识符 函数名( ) { 函数体(包括声明部分和执行部分) } 例:printstar( ) { printf( “ ********** \n”); } (二)有参函数定义的一般形式 类型标识符 函数名(形式参数表) { 函数体(包括声明部分和执行部分) } (三)一个函数可以是空函数 如 dummy( ) { } 要正确实现函数间的相互调用需满足下列条件: 第一,被调用函数必须存在且允许调用;
第二,必须给出满足函数运行时要求的参数 第三,在调用一个函数之前一般应该对被调用函数进行声明 (四)函数声明的一般形式 函数类型函数名(参数类型1,参数类型2,…,参数类型n): 或:函数类型函数名(参数类型1参数名1,参数类型2…) 如: int print( char format,…) fun(in har p1) float add (float, float) 注意:函数声明与函数定义不同! (五)函数调用的一般方法 函数调用形式:函数名(实参表列) 1.函数语句 如:前述例子中的 print0; 2.函数表达式 c=max(a, b) 3.函数参数 m=max(a, max(b, c)) printf(“%d”,max(a,b))
第二,必须给出满足函数运行时要求的参数; 第三,在调用一个函数之前一般应该对被调用函数进行声明。 (四)函数声明的一般形式 函数类型 函数名(参数类型 1,参数类型 2, …, 参数类型 n); 或:函数类型 函数名(参数类型 1 参数名 1,参数类型 2 …); 如:int print(char format, …); char fun2(int i, char p1); float add(float , float); 注意:函数声明与函数定义不同! (五)函数调用的一般方法 函数调用形式: 函数名(实参表列); 1.函数语句 如:前述例子中的 print(); 2.函数表达式 如:c=max(a,b); 3.函数参数 如:m=max(a, max(b,c)); printf(“%d”, max(a,b));
变量的存储类、作用域和存在性,内部和外部函数 变量的存储类、作用域和存在性,内部和外部函数 、局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。 二、全局变量 在函数之外定义的变量称为外部变量,即全局变量(全程变量)。 全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件 结束 使用全局变量可以增加函数间的数据联系 在同一源文件中,如果外部变量与局部变量同名,则在局部变量的作用范围内外部变 量不起作用 变量的存储类别 从变量的作用域(空间)来分,为全局和局部变量 从变量值存在的(生存期)时间来分,可以分为 1.动态存储方式与静态存储方式 静态存储方式:指在程序运行期间分配固定的存储空间的方式。 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间 的方式 2.auto变量 调用函数时系统自动分配存储空间,在函数调用结束时自动释放这 存储空间,称这类局部变量为自动变量 自动变量用关键字auto作存储类别的声明。它也可省 3.用 static声明局部变量
变量的存储类、作用域和存在性,内部和外部函数 4 . 2 变量的存储类、作用域和存在性,内部和外部函数 一、局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。 二、全局变量 在函数之外定义的变量称为外部变量,即全局变量(全程变量)。 全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件 结束。 使用全局变量可以增加函数间的数据联系; 在同一源文件中,如果外部变量与局部变量同名,则在局部变量的作用范围内外部变 量不起作用; 变量的存储类别 从变量的作用域(空间)来分,为全局和局部变量。 从变量值存在的(生存期)时间来分,可以分为: 1. 动态存储方式与静态存储方式 静态存储方式:指在程序运行期间分配固定的存储空间的方式。 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间 的方式。 2. auto 变量 调用函数时系统自动分配存储空间,在函数调用结束时自动释放这 些存储空间,称这类局部变量为自动变量。 自动变量用关键字 auto 作存储类别的声明。它也可省。 3. 用 static 声明局部变量
函数中变量的值在函数调用结束后不消失而保留原值,在下次该函 数调用时,该变量已有值,即为上一次函数调用结束时的值。该局部变量为静态局部变量。 main for(i=0;i<3;i++) printf(“%d”,f(a) 运行结果为: 说明 、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期都不释放 自动变量属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释 、对静态局部变量在编译时赋初值,程序运行时,它已有初值,以后每次调用函数时不再重新赋初值 只是保留上次函数调用结束时的值 对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给 初值 对静态局部变量来说,如不赋初值,编译时自动赋初值0或空字符。 对自动变量来说,如不赋初值,它的值是一个不确定的值。 4、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用。 4. register变量 将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存 中去存取。这种变量称为寄存器变量。 说明 只有局部自动变量和形式参数可作为 register变量 2、不能定义任意多个寄存器变 3、局部静态变量不能定义为寄存器变量。 5、用 extern声明外部变量 1、在一个文件内声明外部变量
函数中变量的值在函数调用结束后不消失而保留原值,在下次该函 数调用时,该变量已有值,即为上一次函数调用结束时的值。该局部变量为静态局部变量。 main() { int a=2, i; for( i=0; i<3; i++) printf(“%d”,f(a)); } 运行结果为:____________ 说明: 1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期都不释放。 自动变量属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释 放。 2、对静态局部变量在编译时赋初值,程序运行时,它已有初值,以后每次调用函数时不再重新赋初值 而只是保留上次函数调用结束时的值。 对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次 初值。 3、对静态局部变量来说,如不赋初值,编译时自动赋初值 0 或空字符。 对自动变量来说,如不赋初值,它的值是一个不确定的值。 4、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用。 4. register 变量 将局部变量的值放在 CPU 中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存 中去存取。这种变量称为寄存器变量。 说明: 1、只有局部自动变量和形式参数可作为 register 变量。 2、不能定义任意多个寄存器变量。 3、局部静态变量不能定义为寄存器变量。 5、用 extern 声明外部变量 1、在一个文件内声明外部变量
na ln i extern A /*外部变量声明*/ nt A=13 /*定义外部变量*/ 2、在多文件的程序中声明外部变量 用 static声明外部变量 在定义外部变量时,加一个 static声明,可以使此变量只能用于本文件中 注:对外部变量加或不加 static声明,都是静态存储,只是作用范围不同,都是在编译时分 配内存的。 用 static来声明一个变量的作用有二: 对局部变量用 static声明,则为该变量分配的空间在整个程序执行期间始终存在。 全局变量用 static声明,则该变量的作用域只限于本文件模块。 另注:用auto、 register、 static声明变量时,是在定义变量的基础上加这些关键字,而不 单独使用。 /*定义整型变量a*/ static /*对变量a声明为静态变量* 此用法不对。编译时会被认为“重新定义” 7.关于变量的声明和定义 般讲,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。 /*是声明不是定义* /*是定义*/
例:main() { extern A; /*外部变量声明*/ printf(“%d”,A); } int A=13; /*定义外部变量*/ 2、在多文件的程序中声明外部变量 6. 用 static 声明外部变量 在定义外部变量时,加一个 static 声明,可以使此变量只能用于本文件中。 注:对外部变量加或不加 static 声明,都是静态存储,只是作用范围不同,都是在编译时分 配内存的。 用 static 来声明一个变量的作用有二: 1、对局部变量用 static 声明,则为该变量分配的空间在整个程序执行期间始终存在。 2、全局变量用 static 声明,则该变量的作用域只限于本文件模块。 另注:用 auto、register、static 声明变量时,是在定义变量的基础上加这些关键字,而不 能单独使用。 如:int a; /*定义整型变量 a*/ static a; /*对变量 a 声明为静态变量*/ 此用法不对。编译时会被认为“重新定义”。 7. 关于变量的声明和定义 一般讲,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。 例: main() { extern A; /*是声明不是定义*/ … } nt A; /*是定义*/ 注: