首页 > 其他分享 >C语言函数

C语言函数

时间:2024-10-17 18:19:02浏览次数:10  
标签:定义 函数调用 C语言 返回值 变量 函数

1.C语言函数的定义

C源程序是由函数组成的。最简单的程序有一个主函数main(),但实用程序往往由多个函数组成,由主函数调用其他函数,其他函数也可以互相调用。函数是C源程序的基本模块,程序的许多功能是通过对函数模块的调用来实现的,学会编写和调用函数可以提高编程效率。

函数的定义通常包含以下内容:

返回值类型 函数名(形参表说明) /*函数首部*/
{
    说明语句 /*函数体*/
    执行语句
}

对上面的定义形式进行以下说明:
(1)“返回值类型”是指函数返回值的类型。函数返回值不能是数组,也不能是函数,除此之外任何合法的数据类型都可以是函数的类型,如:int,long,float,char等。函数类型可以省略,当不指明函数类型时,系统默认的是整型。
(2)函数名是用户自定义的标识符,在C语言函数定义中不可省略,须符合C语言对标识符的规范,用于标识函数,并用该标识符调用函数。另外函数名本身也有值,它代表了该函数的入口地址,使用指针调用函数时,将用到此功能。
(3)形参又称为“形式参数”。形参表是用逗号分隔的一组变量说明,包括形参的类型和形参的标识符,其作用是指出每一个形参的类型和形参的名称,当调用函数时,接收来自主调函数的数据,确定各参数的值。
(4)用{ }括起来的部分是函数的主体,称为函数体。函数体是一段程序,确定该函数应完成的规定的运算,应执行的规定的动作,集中体现了函数的功能。函数内部应有自己的说明语句执行语句,但函数内定义的变量不可以与形参同名。花括号{ }是不可以省略的。

根据函数定义的一般形式,可以定义一个最简单的函数:

int add()
{
    returrn 0;
}

这是C语言中一个合法的函数,函数名为add。它的函数返回值为int,没有形参表,同时函数体内只有一条因为返回值为int而必须有的返回值语句。实际上函数add不执行任何操作和运算,它是一个空函数,在一般情况下是没有用途的,但在程序开发的过程中有时是需要的,常用来代替尚未开发完毕的函数。

2.C语言函数的调用

 主调函数使用被调函数的功能,称为函数调用。在C语言中,只有在函数调用时,函数体中定义的功能才会被执行。C语言中,函数调用的一般形式为:

函数名(类型 形参,类型 形参...);

对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其他构造类型数据及表达式,各实参之间用逗号分隔。

在C语言中,可以用以下几种方式调用函数
 

(1)函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的,例如:

z=max(x,y);

是一个赋值表达式,把max的返回值赋予变量z。

(2)函数语句:函数调用的一般形式加上分号即构成函数语句,例如:

printf("%d",a);
scanf("%d",&b);

都是以函数语句的方式调用函数。

(3)函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的,例如:

printf("%d",max(x,y));/*把max调用的返回值作为printf函数的实参*/

在主调函数中调用某函数之前应对该被调函数进行声明,在主调函数中对被调函数进行声明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值进行相应的处理。其一般形式为:

类型说明符 被调函数名(类型 形参,类型 形参...);

需要注意的是,函数的声明函数的定义有本质上的不同,主要区别在以下两个方面:

(1)函数的定义是编写一段程序,应有函数的具体功能语句——函数体,而函数的声明仅是向编译系统的一个说明,不含具体的执行动作。
(2)在程序中,函数的定义只能有一次,而函数的声明可以有多次。

3.C语言变量的存储类型

在C语言中,变量是对程序中数据所占内存空间的一种抽象定义,定义变量时,用户定义变量的名、变量的类型,这些都是变量的操作属性。不仅可以通过变量名访问该变量,系统还通过该标识符确定变量在内存中的位置。

在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是CPU的寄存器。变量的存储类型关系到变量的存储位置,C语言中定义了4种存储属性,即自动变量(auto)、外部变量(extern)、静态变量(static)和寄存器变量(register),它关系到变量在内存中的存放位置,由此决定了变量的保留时间和变量的作用范围。

变量的保留时间又称为生存期,从时间角度,可将变量分为静态存储动态存储两种情况:

(1)静态存储是指变量存储在内存的静态存储区,在编译时就分配了存储空间,在整个程序的运行期间,该变量占有固定的存储单元,程序结束后,这部分空间才释放,变量的值在整个程序中始终存在。

(2)动态存储是指变量存储在内存的动态存储区,在程序的运行过程中,只有当变量所在的函数被调用时,编译系统才临时为该变量分配一段内存单元,函数调用结束,该变量空间释放,变量的值只在函数调用期存在。

变量的作用范围又称为作用域,从空间角度,可以将变量分为全局变量局部变量

(1)局部变量是在一个函数或复合语句内定义的变量,它仅在函数或复合语句内有效,编译时,编译系统不为局部变量分配内存单元,而是在程序运行过程中,当局部变量所在的函数被调用时,编译系统根据需要,临时分配内存,调用结束,空间释放。

(2)全局变量是在函数之外定义的变量,其作用范围为从定义处开始到本文件结束,编译时,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定单元。

后面,我们将对这四种类型变量逐一展开实例讲解。 

4.C语言auto自动变量类型

自动变量
函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量

自动变量用关键字auto进行存储类别的声明,例如声明一个自动变量:
 

int fun(int a)
{
    auto int b,c=3;/*定义b,c为自动变量*/
}

a是函数fun()的形参,b、c是自动变量,并对c赋初值3。执行完fun()函数后,自动释放a、b、c所占的存储单元。

5.C语言extern外部变量

外部变量,即全局变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。

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

通常的,用extern声明外部变量,扩展程序文件中的作用域。

 6.C语言static静态变量详解

有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为静态局部变量,用关键字static进行声明。

通过用static类型声明后的变量,其变量的内存空间位于内存的全局静态区,仅会初始化一次,这是一个非常重要的特性,请大家通过如下的程序理解:

#include<stdio.h>
static a=5;
int fun()
{
    a=a*2;
    printf("a=%d\n",a);
    return 0;
}
int main()
{
    int i=0;
    for(i=0;i<10;i++)
    {
        fun();
    }
    return 0;
}

可以观察a的值输出如下: 

a=10
a=20
a=40
a=80
a=160
a=320
a=640
a=1280
a=2560
a=5120

这个结果的原因在于,每次a的值是接着上一次函数调用的值继续运算的,并非每次都初始化从5开始计算,这就是static的特性,请大家好好理解。

7.C语言register寄存器变量 

为提高效率,C语言允许将局部变量的值存放在CPU的寄存器中,这种变量叫做寄存器变量,用关键字register声明。使用寄存器变量需要注意以下几点:
(1)只有局部自动变量和形式参数可以作为寄存器变量。
(2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量。
(3)不能使用取地址运算符“&”求寄存器变量的地址。

例如如下定义:

register int a=0;//将变量a存储在寄存器上

在C语言发展迭代的今天,当我们尝试用regiter声明一个变量时,编译器很可能会根据情况,把"register"忽略掉,需要大家知晓这一情况。

以上就是c语言函数的全部内容 有需要习题的小伙伴可以私聊我 有全部课程的一整套习题正在整理中。

 

标签:定义,函数调用,C语言,返回值,变量,函数
From: https://blog.csdn.net/xinfanyyds/article/details/143025486

相关文章

  • SQL 分析函数看这篇函数就够了
    数据库SQL分析函数/窗口函数专题,绝对值得收藏!此专题几乎涵盖所有主流数据库,如Oracle、Hive、MySQL8.0、MaxComputer等。在企业面试中,分析函数问题更是备受青睐,无论是笔试还是面试,基本都绕不开。分析函数主要分为以下四类:聚合分析函数SUM:用于计算组中表达式的累积......
  • 实验三: JavaScript数组与函数
    实验目的熟练掌握常用JavsScript的数组、自定义函数、作用域。实验内容数组定义及元素获取;数组的遍历;数组内容的增删改查;数组的排序;数组的反转、截取、合并、元素拼接函数的声明;函数的调用;匿名函数;作用域。实验步骤:数组定义及元素获取;数组的遍历;数组内容的增删改查......
  • C语言[数组作函数参数]
    输入10个整数作为一个数组,要求判断并且输出其中最大的值和它是数组中的第几位数。本次代码调用max函数数组元素为a[1]~a[9]代码如下:#include<stdio.h>intmain(){  intmax(intx,inty);  inti,m,n,a[10];  printf("enter10intergernumber:"); ......
  • C语言typedef常用方法
    在C语言中,typedef关键字可以用来为已有的数据类型定义一个新的标识符,它的常用方法有:typedef的4种常见用法:一、给已定义的变量类型起个别名二、定义函数指针类型三、定义数组指针类型四、定义数组类型总结一句话:“加不加typedef,类型是一样的“,这句话可以这样理解:没加type......
  • MySQL 【日期】函数大全(六)
    目录1、TIME_FORMAT() 按照指定的格式格式化时间。2、TIME_TO_SEC() 将指定的时间值转为秒数。3、TIMEDIFF() 返回两个时间之间的差值。4、TIMESTAMP() 累加所有参数并将结果作为日期时间值返回。5、TIMESTAMPADD() 将指定的时间间隔加到一个日期时间值上并返回结果......
  • 鸿蒙开发黑科技:前端页面轻松调用 ArkTS 函数
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在鸿蒙开发中,前端页面(HTML)有时候需要......
  • DiTAC:不知如何提升性能?试试这款基于微分同胚变换的激活函数 | ECCV'24
    非线性激活函数对深度神经网络的成功至关重要,选择合适的激活函数可以显著影响其性能。大多数网络使用固定的激活函数(例如,ReLU、GELU等),这种选择可能限制了它们的表达能力。此外,不同的层可能从不同的激活函数中受益。因此,基于可训练激活函数的兴趣日益增加。论文提出了一种基于有......
  • Z函数(扩展KMP)
    扩展KMP(Z函数)Z数组简单理解\(Z[i]\)表示字符串从i出发,与整体相比有多长的公共前缀aaabaac7210210可以先理解马拉车再来看首先,设置两个类似的东西,关键点\(c\)和最右边界\(r\),表示\(Z[c]\)是目前所有\(Z\)中,\(i+Z[i]\)最右边的那个对于: r01......
  • Python join()函数使用详解
    在Python中,join()函数是字符串的一个方法,用于将一个可迭代对象(如列表)中的元素连接成一个字符串。join()函数的语法如下:string.join(iterable)其中,string是连接中的字符串,iterable是要连接的可迭代对象。下面是join()函数的使用示例:#连接列表中的元素my_list=['Hello',......
  • Java 8 的 Lambda、函数式接口、Stream 用法和原理
    我是风筝,公众号「古时的风筝」。一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!文章会收录在JavaNewBee中,更有Java后端知识图谱,从小白到大牛要走的路都在里面。公众号回复『666』获取高清大图。就在今年Java25周岁了,可能比在座的各位中的一些......