函数的分类

定义来看

库函数
就是c语言程序文件自带的函数,使用是要引入该函数所在的文件(井号那个头文件)
分类
字符分类函数和字符转换函数

头文件:ctype.h

1、字符分类函数

就是这个函数通过返回值判断这个字符是否为一个特定的类型

以下是常见字符分类函数

关于一些问题:

什么是?

控制字符:相当于指令字符,可以让电脑办事情(比如回车,换行,响铃),大多数情况下无法显示出来

图形字符:电脑可以显示的字符,不如说标点符号,字母,数字这些

可打印字符:就是图形字符,所有能被电脑显示的字符

例:

输入一串字符串,把其中所有小写字母都转换成大写字母

#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[]="Hello World";
int i=0;
while(arr[i]!='\0')
{
if(islower(arr[i]))
arr[i]-=32;
printf("%c",arr[i])
i++;
}
return 0;
}

2、字符转换函数

就是这个函数把一个类型的字符转换成另一个类型,在c语言里面就基本是这两个(大小写字母转换)

tolower(大写转小写)

toupper(小写转大写)

emm依旧是在括号里面直接写

if(islower(arr[i]))
{
arr[i]=toupper(arr[i]);
}
目录路径

emm反正是有这么一个东西,操作文件和目录路径用的,但是基本是用不到的,再用再搜吧

而且退一步来讲,你要真文件操作,放着终端不用为什么要用c语言?这不是纯纯思想有问题?

=__=

诊断

用于内部错误检测

图形

用于屏幕管理和各种图形功能

输入输出

头文件stdio.h

这个基本是必须写的,这里就不再说明了

接口

用作与DOS,BIOS和硬件的接口

字符串

字符串操作和处理

数学

用于数学或者函数运算

日期和时间

用于日期时间转换操作

自定义函数

就是自己定义的函数,一般就是有啥代码你不想一直重复写,然后把这个代码设置成你自己自定义的函数,可以实现代码复用,需要注意的是,main函数里面不可以嵌套自定义函数

基本格式如下:

返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...) {
// 函数体:实现具体逻辑
return 返回值; // 若返回值类型非void
}

例:

调用方式:

1、add(1,2);

2、swap(&x, &y);(这个是指针)

int add(int a, int b) {
return a + b;
}
void swap(int *a, int *b) {
int temp = *a;
        - a = *b;
        - b = temp;

}

有无返回值来看

有返回值

函数调用的时候有一个结果要被返回,类型就是我们定义的一开始的返回值类型,这个一般是求和啊,求积这种的

无返回值

函数调用的时候没有返回值,这时候返回类型写函数void,这个一般是写那种功能性的代码用的

是否带参数来看

无参函数

就是自定义函数的时候不写参数,就只写一个括号

例:

int sow()
{
//这里写代码
}

这个一般是写一些不需要输入参数的功能性代码(比如说输出)

带参函数

就是上面的一般的自定义函数

比如说求和这种的需要传入参数并进行操作的代码

c语言程序结构

  • 一个或者多个函数组成

  • 必须包含main函

定义和返回值

定义及声明

定义

就是一个函数模块

无参函数
带参函数
空函数

比较鸡肋没有什么太大的用处其实,主要是标识程序各个功能部分用的,你完全可以不写

类型说明符 函数名()
{}
声明

先定义后调用&先调用后定义,就是有一个这个东西,但是别用第二个会出错,最好用第一个

返回值

在运用完一个函数之后的最终返回给我们的结果,在不指定返回值类型时,默认为int

返回语句

return(表达式);/return;/return 变量;

函数返回值

1、返回值类型为定义函数类型,类型如果不一样系统会进行强制转换

2、不写返回值时,依然有返回值,

return区分:

1、写在main函数的:return 0表示正常执行代码,return 非0表示异常

(这里的正常和异常是给操作系统看的,对于我们来说其实我们能看到的程序运行结果不会又什么变化,写return 非0通常是用来标记代码,也就是告诉我们自己这个代码表示的事异常状态)

比如

#include <stdio.h>

int main() {
    int num;
    printf("请输入一个正整数:");
    scanf("%d", &num);

    // 异常场景:输入的不是正整数
    if (num <= 0) {
        printf("错误:输入必须是正整数!\n");
        return 1; // main返回1,告知系统“程序执行异常”
    }

    // 正常逻辑:判断是否为素数并输出
    int is_prime = 1;
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            is_prime = 0;
            break;
        }
    }
    if (is_prime) {
        printf("%d 是素数\n", num);
    } else {
        printf("%d 不是素数\n", num);
    }

    return 0; // 正常执行完,返回0
}

这里的1其实在我们编辑运行的时候和0在显示上并没有太大区别,这个就是提醒我们上面输入的是异常状态

2、写在自定义函数的:return 0表示返回数据0;return 1表示返回数据1;

这里0和1就是布尔的真和假,在我们进行函数调用的时候返回值对程序会有影响

main函数是自定义函数,为什么不需要调用?

这个是c语言编译器的一个功能,main函数不需要调用编译器就能自动识别并且执行

为什么main函数是int类型?

对应的return返回值为0;

函数间数据传递

  • 主调和被调函数之间存在数据传递关系,主要有的三种形式是

    • 1 实参和形参
    • 2 return语句
    • 3 全局变量(不常用)
  • 实参和形参

    • 实参 主函数调用定义函数的时候真正的参数
    • 形参 定义的函数的参数
  • 值传递和地址传递

    • 值传递

                  实参的值赋值到形参中然后调用函数

  • 地址传递
              一般用于数组,数组在调用函数的时候,把数组所在的位置传给函数的形参,形参可以修改这个位置里面的所有数值然后再返回,改变这个位置的值之后这个数组的值就已经被永久修改了
  • 简单变量作参数

      简单变量就是我们常见的比较简单的变量
  • 数组作参数

    • 数组元素作为函数的实参
    • 一维数组名作为函数的参数
    • 多维数组名作为参数
      其实区别就是一个是名字一个是元素

函数调用

  • 函数调用的语法要求

    • 参与表达式运算
    • 函数调用语句
    • 作为其他函数调用的实参
  • 函数的嵌套调用

    一般就是递归要写,可以定义两个函数,第二个函数可以使用第一个函数
  • 函数的递归调用

    汉诺塔

变量的作用域及存储类型

  • 变量的作用域

    • 局部变量——函数里面
    • 全局变量——函数外面
  • 变量的存储类型

    • 自动变量(ato)
      • 定义函数的时候用的变量
    • 静态变量(static)
      • static,一般是想保留上一次结果时使用

- 函数里的静态变量:第一次进函数时初始化,之后哪怕函数执行完结束了,它的值也不会丢,下次再调用这个函数,还能接着用上次的值。

- 全局的静态变量:只能在当前的 .c 文件里用,别的文件就算想调用也找不到它。
类比:函数里的静态变量像你宿舍的储物柜,哪怕你离开宿舍(函数结束),柜子里的东西还在;全局静态变量像你宿舍内部的公用物品,只有宿舍里的人能碰。

  • 寄存器变量(register)

早期的时候提速用的,现在基本不用了,不能用&,它没有内存地址

你可以理解为“申请高速VIP席位”的变量。它请求编译器把变量存到CPU的寄存器里(不是普通内存),这样访问速度特别快,但这个请求编译器不一定答应(寄存器空间有限)。另外,这种变量不能用 & 取地址。
类比:像收银员手边的零钱盒,拿取零钱比去仓库(内存)里取快多了,但零钱盒空间小,装不下太多东西。

  • 外部变量(extern)

本质是“借别人的全局变量用”。如果一个全局变量定义在A文件里,B文件想用到它,只要用 extern 声明一下,就相当于告诉编译器“这个变量在别的文件里,我要借用”。
类比:邻居家有个电钻(A文件的全局变量),你想用时不用自己买,跟邻居说一声(extern声明)就能借来用

  • 变量分类总结

核心维度    对应类型    特点
存储位置    内存型       auto、static、extern 存在普通内存里
寄存器型    register     优先存CPU寄存器(看编译器脸色)
生命周期    临时型       auto 随函数创建、销毁
持久型        static、extern 程序运行期间一直存在
作用域        局部型       auto、register、函数内static 只能在函数/代码块里用
全局型        extern、全局变量 能跨文件使用(extern是声明,全局变量是定义)
 

内部函数和外部函数

函数的存储类型,决定了这个函数能不能被别的 .c 文件调用:

  • 内部函数

用 static 修饰的函数,只能在当前 .c 文件里被调用,别的文件就算想调用也找不到它。也叫“静态函数”。
类比:你写的一个专门处理字符串的小函数,只给你当前文件的代码用,别人用不上,也不会和别人的函数重名

格式:

static 数据类型 函数名 (形参说明)

  • 外部函数

C语言里函数默认就是外部的,不用写 extern 关键字。能被其他 .c 文件调用,只要在调用的文件里声明一下函数原型就行。
类比:一个公开的工具函数,比如计算两数之和的 add() ,别的文件都能拿来直接用

格式:

extern 数据类型 函数名(形参说明)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐