C语言 字符数组/多维数组/函数/作用域

1. 遍历数组

  • 遍历数组:通过循环的方式来把数组中的每个元素数据进行查询

  • 使用for循环遍历数组更多一些

  • 数组长度计算:

    • 数组总字节数/元素的数据类型的字节数

    • 数组总字节数/第一个元素的字节数

  • 数组遍历相关的案例:求和,求平均值,求最大值,求最小值,冒泡排序

2. 字符数组

  • 字符数组:多个字符组成的数组,可以看成是字符串

  • 字符数组的结尾应该使用\0标识结束,\0是空字符,没有任何显示

  • 字符数组的五种定义方式:

    cs 复制代码
    方式1:设置了长度后,手动在结尾处添加\0
    char chs1[5]={'a','b','c','d','\0'};
    方式2:设置了长度后,编译器会在末尾添加一个\0,标识结束
    char chs2[5]={'a','b','c','d'};
    方式3:没有设置长度,系统也不会在结尾处添加\0
    char chs3[]={'a','b','c'};
    ​
    注意情况:设置了长度,里面的字符个数和长度一致,没有手动添加\0,编译器也不会在结尾处自动的添加\0
    char chs0[5]={'a','b','c','d','e'}; 
    ​
    方式4:
    char chs4[]={"abcde"};
    方式5:
    char chs5[]="abcdef";
  • 字符数组的遍历和展示

    • 字符数组也是数组,所以,可以使用for循环进行遍历

    • 此时如果使用sizeof计算字符数组的长度的时候,计算的是实际的字节数,也就是说如果用这种方式来遍历数组,此时会多遍历一次,后面会使用字符串相关的函数来计算字符数组的长度,然后再遍历更加合适

    • 字符数组可以看成是字符串,所以,可以使用%s来显示整个字符数组的数据内容

3. 多维数组

  • 多维数组:数组中的元素如果还是数组,此时该数组就可以看成是多维数组

  • 多维数组分为:二维数组,三维数组,四维数组...

  • 二维数组:一个数组中的元素如果还是一个数组,此时该数组可以看成是多维数组中的二维数组

  • 一维数组(普通数组):使用一个索引

  • 二维数组:使用两个索引,两个索引也可以理解为行下标和列下标

  • 二维数组的定义方式:

    cs 复制代码
    方式1:
    int nums[2][2];
    nums[0][0] = 10;
    nums[0][1] = 20;
    nums[1][0] = 30;
    nums[1][1] = 40;
    方式2:
    int nums[2][3]={{1,2,3},{4,5,6}};
    方式3:
    int nums[2][2]={1,2,3,4};
    方式4:
    int nums[][2]={1,2,3,4};
  • 二维数组的行下标和列下标的计算

    cs 复制代码
    行 = 二维数组的总字节数/第一个行的总字节数
    列 = 行的总字节数/第一行第一列的字节数
    列 = 行的总字节数/数组类型的字节数
  • 二维数组的遍历使用的是嵌套for循环(双层for循环),外层循环遍历的是行,内层循环遍历的是列

  • 二维数组在内存中存储也是连续的,和一维数组存储方式一样,所以,二维数组的本质其实还是一维数组

4. 函数相关的概念

  • 函数:就是一些重用代码的封装,一个函数就是一个功能

  • 函数作用:代码的重用,提升可维护性

  • 为什么需要使用函数

    • 程序设计的过程中,在某些位置,或者是特定的情况下,有一些代码需要重复书写或者是使用,此时可以把这些重复使用的代码进行封装,形成一个函数,在需要的位置直接使用该函数即可

      为了方便使用代码,或者是方便维护程序

  • 一个c程序可以由一个.c文件或者是多个.c文件组成

    一个.c文件是由一个或者多个函数组成.所以,函数可以看成是一个.c文件的基本组成单位

    c中函数之间是可以相互调用的,主函数只能有一个,其他函数中不允许调用主函数

5. 函数的定义和函数调用

  • 函数如果要使用,首先需要先定义函数,然后调用即可

  • 函数定义:

    cs 复制代码
    返回值类型名 函数名([参数列表]){
      函数体/代码块
      return ;
    }
  • 函数调用:

    cs 复制代码
    函数名([参数列表]);

6. 函数的参数和返回值

  • 函数参数:分为形参和实参

    • 形参:函数在声明或者定义的时候,函数名字后面小括号中声明的变量就是形参

    • 实参:函数在调用或者使用的时候,函数名字后面小括号中传入的变量或者数据就是实参

  • 返回值:如果一个函数在定义的时候,返回值类型是void,代表的是空类型,就意味着该函数没有具体的返回值

  • 如果一个函数在定义的时候,返回值类型不是void,并且函数内部使用return,后面还有具体的数据,那么该函数有返回值

  • 如果一个函数在定义的时候,返回值类型不是void,函数内部没有return,或者说有return,但是后面没有具体的数据,此时该函数没有具体的返回值,可以说有返回值,但是不明确,如果此时外部接收存储该返回值数据就是一个垃圾值,或者叫随机值,没有意义

7. 函数的四种不同表现形式

  • 无参数无返回值的函数:

  • 有参数无返回值的函数:

  • 无参数有返回值的函数:

  • 有参数有返回值的函数:

8. 主函数的理解

  • 主函数:就是一个函数,是程序的主入口,有且只能有一个,主函数中可以调用其他函数,其他函数不能调用主函数,主函数中不能调用自己。

  • 主函数的返回值是int类型,默认内部应该使用return返回0,表示成功,非0则表示失败,建议自己手动书写,如果不写,编译器默认会添加,

  • 主函数的参数有两个,第一个argc,第二个argv,argc表示参数的个数,argv表示参数值,是一个数组,可以通过命令的方式执行xxx.exe程序,并且在后面传入参数到该程序中

9 . 函数原型

  • 函数原型:指的是函数原型语法,分为函数声明和函数定义

  • 函数原型的作用:解决先调用函数,后声明函数出现的警告信息

  • 如果先有函数声明(定义/实现),后调用函数,其实可以不需要声明函数原型

  • 函数原型声明:三种方式:

    cs 复制代码
    方式1:函数头部后面加分号
    void f1(int a);
    或者
    int f2(int a,int b);
    简写方式:
    void f1(int);
    或者
    int f2(int,int);
    ​
    方式2:直接定义一个函数
    void f2(int a){
      函数体
    }
    ​
    方式3:函数头部,参数列表中可以使用...表示多个参数
    void f3(char num,...);
    ​
    ​
    更加专业一些:实际上方式1,才算是真正的函数原型声明写法

10. 作用域

  • 作用域:变量的使用或访问范围

  • 作用域分为:全局作用域,局部作用域,块级作用域

  • 全局变量:在函数外部或者在函数外部的上面声明的变量

  • 局部变量:在函数内部声明的变量

  • 块级变量:在大括号内部声明的变量

  • 全局作用域:全局变量的使用范围,整个文件

  • 局部作用域:局部变量的使用范围,整个函数

  • 块级作用域:块级变量的使用范围,整个大括号内部

  • 全局变量/全局常量/全局数组如果声明了,没有初始化,默认是0

  • 局部变量/局部常量/局部数组如果声明了,没有初始化,默认是垃圾值

相关推荐
ZVAyIVqt0UFji36 分钟前
go-zero负载均衡实现原理
运维·开发语言·后端·golang·负载均衡
谢家小布柔38 分钟前
Git图形界面以及idea中集合Git使用
java·git
loop lee38 分钟前
Nginx - 负载均衡及其配置(Balance)
java·开发语言·github
smileSunshineMan41 分钟前
vertx idea快速使用
java·ide·intellij-idea·vertx
阿乾之铭41 分钟前
IntelliJ IDEA中的语言级别版本与目标字节码版本配置
java·ide·intellij-idea
SomeB1oody1 小时前
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存
开发语言·后端·rust
toto4121 小时前
线程安全与线程不安全
java·开发语言·安全
筏镜2 小时前
调整docker bridge地址冲突,通过bip调整 bridge地址
java·docker·eureka
水木流年追梦2 小时前
【python因果库实战10】为何需要因果分析
开发语言·python
winner88812 小时前
git merge 冲突 解决 show case
java·git·git merge·git冲突