首页 > 其他分享 >2024-02-17-物联网C语言(3-函数)

2024-02-17-物联网C语言(3-函数)

时间:2024-02-17 14:13:23浏览次数:24  
标签:02 return 函数 17 int C语言 num 返回值 定义

3.函数

3.1 函数的概念

函数是c语言的功能单位,实现一个功能可以封装一个函数实现。

定义一个函数的时候需要一切以功能为目的,根据功能去定义函数的参数和返回值。

3.2 函数的分类

3.2.1 从定义角度分类

  1. 库函数(c库实现)
  2. 自定义函数(程序员自定义函数)
  3. 系统调用(操作系统实现的函数)

3.2.2 从参数的角度分类

  1. 有参函数

    函数是有形参的,可以是一个,也可以是多个,参数的类型完全取决于函数的需要

    int fn(int a,float b,double c){
        
    }
    
  2. 无参函数

    函数没有参数,在形参列表的位置写个void,或者什么都不写

    int fn(void){
        
    }
    
    // 或者
    int fn(){
        
    }
    
  3. 从返回值角度分类

    1. 带返回值的函数

      在定义函数的时候,必须带着返回值的类型;在函数体内部,必须有return;

      如果没有返回值类型,默认返回整型。

    2. 没有返回值的函数

      在函数定义的时候,函数名字前面加上void,在函数返回的时候不需要写ruturn;

3.3 函数的定义

返回值类型 函数名(形参列表){
    函数体
}

注意:

  1. 函数名是标识符,需要满足标识符的命名规则
  2. 形参可以用,也可以没有,但是即使没有,函数名字后面必须加上括号
  3. 函数体上下位置必须有大括号
  4. 形参必须带类型
  5. 如果要返回函数执行的结果,也就是返回值,则return后面跟的变量值或者值,必须与函数名左边的返回值类型一致
#include <stdio.h>

int main(){

    printf("hello world");
    return 0;
}

3.4 函数的声明

  1. 概念

    对已经定义的函数进行说明

  2. 为什么要声明?

    有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数

    因为编译器在编译的c程序的时候,是从上往下编译的。

  3. 声明的方法

    1.主调函数和被调函数在同一个c文件中的时候

    1. 被调函数在主调函数之上,就不需要声明;

    2. 被调函数在主调函数之下,就需要声明。

    #include <stdio.h>
    
    // 被调函数在主函数的下方
    // 声明函数
    int myfun();
    
    int main(){
       myfun();
    }
    // 定义函数
    int myfun(){
       printf("hello world!");
       return 0;
    }
    

    2.主调函数和被调函数不在同一个c文件中的时候

    1. 直接声明法

    将被调用的函数第一行拷贝过去,后面加上分号,前面加上extern

    1. 间接声明法

    将函数声明放在头文件中,.c程序包含这个头文件即可

3.5 函数的调用

函数的调用方法

  1. 带返回值: 变量 = 函数名(实参列表)
  2. 不带返回值:函数名(实参列表)
#include <stdio.h>

// a,b为形式参数
func(int a, int b)
{
    printf("两数之和为: %d", a + b);
}

int main(int argc, char const *argv[])
{
    /* code */
    int c = 1, d = 10;
    // c,d为实参
    func(c, d);
}

输出结果:

两数之和为: 11

3.6 函数总结

在定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。

当编写函数的时候,不要一开始就想着如何传参和返回值应该是什么。而是在编写代码的途中,发现需要使用某些值,此时发现这些参数不存在,就需要使用传参了。

当函数编写完成后,考虑需要将返回值给其他函数进行使用,此时需要考虑返回值。

使用函数的优势

  1. 定义一次,可以多次调用,减少代码的冗余度
  2. 代码模块化,方便调试和调用,且阅读修改方便

3.7变量的存储类别

3.7.1 内存的分区

  1. 内存:物理内存和虚拟内存

    物理内存:实实在在的存储设备

    虚拟内存:操作系统虚拟出来的内存

    操作系统会在物理内存和虚拟内存之间做映射,在32位系统下,每个进程的寻址范围是4G,0x00000000 ~ 0xffffffff

    在写应用程序的时候,能够看到的都是虚拟内存。

    在32位系统中,虚拟内存被分为两个部分:3G的用户空间 + 1G的内核空间。

    其中,用户空间是当前进程私有的,而内核空间是所有进程共有的。

  2. 在运行程序的时候,操作系统会将虚拟内存进行分区

    :在动态申请内存的时候,在堆里开辟空间

    :主要存放局部变量

    静态全局区

    1. 未初始化的静态全局区:

      静态变量(定义变量的时候,加上static修饰)

      全局变量,没有初始化的,存储在该区

    2. 初始化的静态全局区

      全局变量、静态变量,赋初始值的存放在该区

    代码区:存放代码

    文字常量区:存放常量

3.7.2 普通全局变量

概念:在函数外部定义的变量

int num = 100;
int main(){
    return 0;
}

作用范围:

  1. 全局变量的作用范围是程序所有的地方
  2. 使用之前需要声明,声明方法extern int num
  3. 声明的时候不要赋值
  4. 如果不赋初始值,默认为0
#include <stdio.h>

int num=666;

int main()
{
    printf("num = %d", num);
    return 0;
}

输出结果

num = 666

3.7.3 静态全局变量

概念:定义全局变量的时候使用static修饰

范围: 只能在它定义的.c文件中使用。

生命周期:在程序的整个运行过程中一直存在

#include <stdio.h>

static int num;

int main(){
    printf("num = %d\n", num);
    num++;
    printf("num = %d", num);
    return 0;
}

输出结果:

num = 0
num = 1

3.7.4 普通局部变量

概念:在函数内部定义的,或者符合语句中定义的变量

int main(){
    int num; // 普通局部变量,不进行初始化,其值是随机值
}

作用范围:在函数定义的变量,只能在函数内部使用;在复合语句中定义的变量,只能在复合语句中有效;

生命周期:在函数调用前,局部变量不占用空间;调用函数时,才开始为局部变量开辟空间;函数结束时,局部变量空间释放。

#include <stdio.h>

int myfun(){
    int num = 100;
    printf("num = %d\n", num);
    return 0;
}

int main(){
    myfun();
    return 0;
}

输出结果

num = 100

3.7.5 静态局部变量

概念:定义局部变量的时候,前面加上static修饰

作用范围:在它定义函数或者符合语句中有效

生命周期:第一次调用函数的时候,开辟空间赋值;函数结束后,不释放;以后在调用函数的时候,就不再开辟空间或者赋初始值,而是直接使用以前的那个变量

#include <stdio.h>

int myfun()
{
    static int num; // 静态局部变量,不赋初始值,即为0
    printf("num = %d\n", num++); // 存储空间不变,而且只初始化一次,函数结束,空间不释放
    return 0;
}

int main()
{
    myfun();
    myfun();
    myfun();
    return 0;
}

输出结果

num = 0
num = 1
num = 2
类型 不赋初始值时的值为
普通局部变量 随机值
静态局部变量 0
普通全局变量 0
静态全局变量 0

3.7.6 外部函数

普通函数即为外部函数,函数可以在程序的任意一个文件中调用。

在分文件编程中,只需要将函数的实现过程写在指定的.c文件中,然后将其声明写在指定的.h文件中,其他文件只要包含这个头文件,都可以使用这个外部函数。

3.7.7 内部函数

内部函数也称为静态函数,返回值类型前面加上static修饰。

作用范围:内部函数只能在定义其函数的.c文件中使用

外部函数与内部函数的区别:外部函数可以在任意地方使用,内部函数仅能在所定义的.c文件中使用

注意:

  1. 在同一作用范围内,不允许变量重名
  2. 作用范围不同可以重名
  3. 局部范围内,重名的全局变量不起作用(就近原则)
int num = 100;
int main(){
    int num = 999;
    // 这个函数中使用num,会取num =999;
    return 0;
}
// 在这个区域使用num,会取num = 100;

标签:02,return,函数,17,int,C语言,num,返回值,定义
From: https://www.cnblogs.com/hasaki-yasuo/p/18017915

相关文章

  • 2024 寒假做题总结
    P2146[NOI2015]软件包管理器思路分析树链剖分板子,每次安装时,将\(1\)到\(x\)的链变为\(1\),卸载时,将\(x\)的子树变为\(0\)。代码#include<iostream>usingnamespacestd;inlineintread(){registerintx=0,f=1;registercharc=getchar();while(c<'0'......
  • P1217 [USACO1.5] 回文质数 Prime Palindromes
    [USACO1.5]回文质数PrimePalindromes题目描述因为\(151\)既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以\(151\)是回文质数。写一个程序来找出范围\([a,b](5\lea<b\le100,000,000)\)(一亿)间的所有回文质数。输入格式第一行输入两个正整数\(a\)......
  • 刷题记录_2024寒假2/17
    我都AFO了为什么还要我写题目P多少多少默认洛谷P3313旅行题意略,自己不会看吗考虑对每个信仰开一个线段树,下标为dfs序,然后就是树剖板子对于这种开一堆动态开点线段树的题目可以存每个线段树的根节点然后就只需要开一个结构体了code:#include<bits/stdc++.h>#definelct[n......
  • Windows Server 2022 新的服务管理 API 提供了更多的选项和功能,可以更灵活地进行服务
    sc 命令是Windows操作系统自带的一种命令行实用程序,用于创建、删除、启动、停止以及配置Windows服务。通过 sc 命令,您可以直接将可执行文件注册为服务,而不需要第三方工具的帮助。sc 命令提供了丰富的选项,如启动类型、依赖关系、服务描述等。instsrv 和 srvany 是两个......
  • 2.17
    久违的更新Vue2跳转传参//跳转传参//通过查询参数传参//to="/路径?参数名=参数值"//接收//$route.query.参数名//通过动态路由传参://首先要设置动态路由//{//  path:'/ssss/:words'//}//然后配置导航链接//to="/路径/参数值"//接收//$route.params.参......
  • 2024-02-17-物联网C语言(2-数组)
    2.数组2.1数组的概念​ 数组是若干个相同类型的变量在内存中的有序存储集合。数组存储一组数据数组里面存储的数据类型必须是相同的数字在内存中会开辟一块连续的空间//定义了一个整型的数组a,a是数组的名字,数组中有10个元素,每个元素的类型都是int类型,而且在内存中连续......
  • 【集训笔记】2024 寒假集训 第一天:最优化问题
    最优化问题二分许多最优化问题可以通过二分来转化为判定性问题。0-1分数规划0-1分数规划思想用于求解分式最优化问题。可以通过对分式二分判定,转化为某一式子大于/小于常数,然后求对应最值即可。动态规划动态规划算法的一大用处就是解决最优化问题。朴素的动态规划效率一般......
  • 0217-0224校赛部分题解
    SMUWinter2024Round#3(Div.2)对于自己比较有价值的题目是D题https://codeforces.com/gym/102897/problem/D?mobile=trueJ题https://codeforces.com/gym/102897/problem/JK题https://codeforces.com/gym/102897/problem/KE题https://codeforces.com/gym/102897/prob......
  • 2024.2.16
    寄算是比较难的树形dp了吧。。。我的跟题解做法不太一样,是维护2个数组\(dp_{0/1,i}\)和\(f_{0/1,i}\)。不太好说,看题解做法吧QAQ。原神#include<bits/stdc++.h>typedeflonglongll;constllSIZE=10000+100;llN,M,a[SIZE];llC;llcnt=1,head[S......
  • 2024-02-16-物联网C语言(数据类型与语句)
    1.第一个C语言程序#include<stdio.h>intmain(){printf("helloworld");return0;}输出结果PSD:\04_Dev\05_C\01数据类型与语句\output>&.\'01_first.exe'helloworld1.1关键字c语言已经定义好的名字,直接拿过来用即可1.1.1数据类型相关的关键字作用:用......