C语言函数的定义、声明、分类以及调用(一)_c语言函数声明-程序员宅基地

技术标签: C语言  c语言  

1、函数的定义、声明、分类以及调用

1.1、函数声明:如果函数声明在main()函数之后,需要进行函数声明,反正不需要,并且函数声明可以在函数体外

返回值类型 函数名(类型1 形参1,类型2 形参2);
返回值类型 函数名(类型1,类型2...);

#include <stdio.h>
#include <math.h>

    void printLog(int a);
    int getNum(int);//声明函数
    void main() {
    
        int b= 10; 

        printLog(b);
        printLog(getNum(20));
        printf("半径是4,圆的面积是:%0.7lf\n",atan(1.0)*4*4);//库函数求圆面积
    }

    void printLog(int a) {
    
        printf("打印参数=%d\n",a);
    }

    int getNum(int b){
    
        return b;
    }

1.2、函数分类:
1、来源分类为库函数和用户自定义函数
2、有无返回值分为有返回值函数和无返回值函数。返回值为int类型的,声明的时候可以省略不写。不会报错,但是不美观。在 C 语言中,由于参数传递是按值传递而非按引用传递,函数返回一个数组需要使用指针的方式进行传递或返回。因此,在不使用指针的情况下,函数无法返回一维数组或二维数组类型的值。
3、参数传递角度分为无参函数和有参函数

冒泡排序写法

#include <stdio.h>
#include <math.h>

#define X 12
//#define Y 4

    void printLog(int a);
    int getNum(int);
    void sortArray(int [X]);
    void printArray(int [X]);

    void main() {
    
        int b= 10; 

        printLog(b);
        printLog(getNum(20));
        printf("半径是4,圆的面积是:%0.7lf\n",atan(1.0)*4*4);

        int c[X]= {
    11,20,15,44,34,65,23,72,9,120,88,111}; 
        sortArray(c);
        printArray(c);
    }

    void printLog(int a) {
    
        printf("打印参数=%d\n",a);
    }

    int getNum(int b){
    
        return b;
    }

    void sortArray(int m[X]){
    
        int tmp;
        for (int i=1;i<=X-1;i++){
    
            for(int j=0;j<X-i;j++){
    
                if (m[j] > m[j+1]) {
    
                    tmp = m [j];
                    m[j] = m[j+1];
                    m[j+1] = tmp;
                }
            }
        }
    }

    void printArray(int m[X]){
    
        int tmp;
        for (int i=0;i<X;i++){
    
                printf("%d ",m[i]);
        }
    }

1.3、函数的形参实参分别占据独立的内存单元,参数传递的是值传递,形参的改变不会影响实参。

    void swap(int a,int b){
    
        printf("交换前:a=%d,b=%d\n",a,b);
        int tmp = 0;
        tmp = a;
        a = b;
        b = tmp;
        printf("交换后:a=%d,b=%d\n",a,b);
    }

2、数组作为函数参数:(1)数组元素作为函数实参; (2)数组名作为函数实参

1、使用数组元素作为实参,在循环语句控制下将数组元素a[i]的值传递给形参x,并将其值减32后保存数数组元素b[i]中,调用函数时,形参x的值发生了改变,而实参a[i]的值并没有发生变化。

#include <stdio.h> 

    char change(char a);

    void main(){
    
        printf("以数组作为函数实参\n");
        change('m');
        int i=0;
        char a[] ="hello",b[10];
        for (;a[i]!='\0';i++)
            b[i]= change(a[i]);
        b[i]='\0';
    }

    char change(char a){
    
        printf("将小写字母转化为大写字母\n");
        printf("转化前小写字母:%c\n",a);
        printf("转化后大写字母:%c\n",a-32);
        return a-32;
    }

2、数组名作为函数的实参
数组名作为函数实参时,形参应当用数组或者指针。由于数组名表示数组的首地址,因此实参向形参传递的不是数组的值,而是实参的首地址,这样的形参数组和实参数组共占用相同的内存单元。

(1)定义函数时,形参数组可以省略数组的长度,直接写成char b[ ]。
(2)实参为数组名,如在change(a);语句中的a就是数组名。调用函数时,会将实参数组a的首地址传递给形参数组b,因此形参和实参的对应元素(如a[0]和b[0],…a[9]和b[9])共占用同一内存单元。
(3)由于形参数组和实参数组共占用相同的内存单元,因此改变形参数组b[ ]的值,实参数组a[ ]的值也会跟着改变。
多维数组名也可以作为函数实参,此时被调用函数中形参数组可以指定每一维的大小,也可省略第一维的大小,但第二维的大小不能省略,而且要和实参数组第二维的大小相同。二维数组是由若干个一维数组组成的,在内存中,数组按行存放,因此在定义二维数组的时候,必须指定列数(第二维),以便系统能够区分每一行。

#include <stdio.h> 

    char change(char a);
    void superChange(char b[]);

    void main(){
    
        printf("以数组作为函数实参\n");
        puts("调用前函数的值:");
        change('m');
        int i=0;
        char a[] ="hello",b[10];
        for (;a[i]!='\0';i++)
            b[i]= change(a[i]);
        b[i]='\0';
        puts("调用后函数的值:");
        puts(b);

        superChange(a);
    }

    char change(char a){
    
        //printf("将小写字母转化为大写字母\n");
        //printf("转化前小写字母:%c\n",a);
        //printf("转化后大写字母:%c\n",a-32);
        return a-32;
    }

    void superChange(char b[10]){
    
        int i=0;
        for (; b[i]!='\0'; i++){
    
            b[i]=b[i]-32;   
        }
        printf("调用函数的结果:");
        puts(b);  
    }

函数参数传递的方式有两种: 按值传递:参数传递时将实参的值传递给了形参,形参和实参各占独立的内存单元。在这种结合方式下,即使形参的值在函数中发生了变化,也不会影响到实参。 按址传递:参数传递时将实参的地址传递给形参,形参和实参占用相同的内存单元。在这种结合方式下,如果形参的值改变了,实际上实参的值也会改变。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/An_Times/article/details/131338626

智能推荐

python爬虫公众号所有信息,并批量下载公众号视频,威力加强版_python公众号下载视频-程序员宅基地

文章浏览阅读377次,点赞3次,收藏9次。import re“Cookie”: “自己获取信息时的cookie”_python公众号下载视频

2021深圳杯数学建模D题分析_2021深圳杯数学建模d题--程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏6次。2021深圳杯数学建模D题分析在求解羊-犬博弈这种持续运动型微分对策问题时,利用机器学习方法可以对其进行测试。本文对羊-犬博弈问题进行研究,通过建立运动学模型对羊和犬的运动形态进行分析,通过分析双方运动时间得出相应围堵策略,并建立可以实现逃逸的机器学习方法供羊学习,而后通过观察羊的学习效率制定一套最优的评价体系,定量的评价一只和多只羊的机器学习方法。..._2021深圳杯数学建模d题-

前端面试手写题系列 IV-程序员宅基地

文章浏览阅读653次,点赞10次,收藏11次。如果真的能记住或者自己能够写出来的话,正则真的是一把利剑,很多自己无法实现或者实现不全的判断函数,都只需要一个正则表达式就可以解决。意思其实很明显,传入一个参数 William,然后等五秒,然后执行 do,然后执行 execute。像这种正则表达式,一般我们感觉都是不会考察的,但是实际上就是考了。// 我们原来的写法就是 fn3(fn2(fn1(1)))// 但是这里我们可以用 compose 函数来实现。// compose 函数的实现。

用例和功能的区别-程序员宅基地

文章浏览阅读4.6k次。用例不是计算机术语,即用例除了用于软件行业,其他行业也在使用。而功能是计算机术语,功能实际描述的是输入-->计算-->输出。用例可以看成是为了完成一个特定目标的一系列功能的组合。用例有几个特征: 一、用例是相对独立的。 二、用例的执行结果对参与者来说是可观察和有意义的。 三、必须有一个参与者发起。 四、必须是以动宾短语形式出现的。 用例以参与_用例和功能的区别

电脑提示“由于仅部分匹配或匹配不明确,因此无法迁移设备”怎么办?_由于部分或不明确的设备匹配,无法从以前的 os 安装迁移 scsi\disk&ven_samsung-程序员宅基地

文章浏览阅读1.2k次,点赞5次,收藏9次。由于仅部分匹配或匹配不明确,因此无法迁移设备”错误可能会在将较旧的系统更新到较新的系统版本或者安装了双系统之后出现,此外,驱动程序不兼容、系统文件损坏、计算机接口故障、系统不支持出现错误的外接设备等也可能导致该错误出现。步骤2:选择左侧的【Windows更新】,点击右侧【检查更新】按钮,耐心等待Windows更新完成,之后重启计算机并查看问题是否解决。步骤2:打开设备管理器之后,选择出现错误的设备,右键点击它,并选择【卸载设备】。选择【更新和安全】。步骤1:右键点击【开始】,选择【设备管理器】。_由于部分或不明确的设备匹配,无法从以前的 os 安装迁移 scsi\disk&ven_samsung&pr

Oracle数据库TNS常见错误解决方法 _oracle tnsping常见报错-程序员宅基地

文章浏览阅读964次。1、ORA-12541:TNS:没有监听器  原因:没有启动监听器或者监听器损坏。若是前者,使用命令net start OracleOraHome10gTNSListener(名字可能有出入)即可;如果是后者,则使用“Net Configuration Assistant”工具向导之“监听程序配置”增加一个监听器即可(基本不用写任何信息,一路OK。在添加之前可能需要把所有的监听器先删!) 2、ORA-12500:TNS:监听程序无法启动专用服务器进程或ORA-_oracle tnsping常见报错

随便推点

java8日期(Date,LocalDate,LocalTime,LocalDateTime),以及处理时间的方法_localdatetime获取当月天数-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏6次。java8日期(Date,LocalDate,LocalTime,LocalDateTime),以及处理时间的方法_localdatetime获取当月天数

eclipse 导入Java项目_如何用eclipse打开java项目-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏18次。偶们公司的这个老项目真的是让人头疼,师父们给偶导了N遍,偶还是记不住。俗话说“好记性不如烂笔头”,于是乎,偶决定记下来,便于自己日后查看,同时也可以给同样小白的同胞们一点参考。说的可能有点啰嗦,但是真的很详细,自己一步步来写的。第一步,打开eclipse,选择一个新的workspace,点击“OK”,进入eclipse界面。第二步,新建Java项目:点击file下面的“new”图标,选择“Java..._如何用eclipse打开java项目

7、SpringBoot高频面试题-程序员宅基地

文章浏览阅读5.7k次,点赞77次,收藏35次。SpringBoot高频面试题,掌握这些,吊打面试官

img宽度 全屏占满 高度和宽度一样_img 长宽顶满-程序员宅基地

文章浏览阅读1.7k次。1、写两个div盒子,父子关系<div class="image"><img :src="food.image"></div>2、样式方面(less语法).image{position: relative;width: 100%;height: 0px;padding-top: 100%; //padding-bottom都可以img{position: absolute;top: 0;left: 0;.._img 长宽顶满

js 获取两个时间范围内的所有日期 以年月日数组形式返回_js根据日期传回日期范围-程序员宅基地

文章浏览阅读347次,点赞7次,收藏8次。js 获取两个时间范围内的所有日期 以年月日数组形式返回_js根据日期传回日期范围

Unity项目源码打开教程_unity源码文件夹 怎么打开-程序员宅基地

文章浏览阅读640次,点赞8次,收藏6次。新手教程,简单易用~_unity源码文件夹 怎么打开

推荐文章

热门文章

相关标签