当前位置: 首页 > news >正文

C语言进阶-数组和函数

C语言

一、数组
一维数组
    通过数组,可以一次性的分配多个同类型的连续存储区
    语法:
    类型 数组名字[元素个数]; 例:int arr[6]; arr占用内存6个整型大小的连续存储空间
    注意:
        通过下标可以区分数组的每个元素
            c语言数组下标从0开始,没有负数
            下标从0开始,一次加一
            arr[0] 表示数组中第一个元素
        数组的每个元素都可以独立的使用
        ***数组在使用时,要注意下标的范围,避免越界***
        每次程序运行,数组所占用的内存空间可能都不一样,这要看系统分配的内存位置
    数组初始化
        int arr[5] = {10, 20, 30, 40, 50}; // arr[0] = 10, arr[1] = 20, ......
        int arr[5] = {0};  // arr[0] = 0, arr[1] = 0,... 五个元素均为0
        int arr[5] = {};   // arr[0] = 0, arr[1] = 0,... 五个元素均为0
        int arr[5] = {1,2};  // arr[0] = 1, arr[1] = 2, arr[2] = 0,除了前两个有值,后面均为0
        int arr[] = {1,2,3,4,5}; //不定义元素个数,默认为后面花括号中元素的实际个数
        使用memset初始化
        int arr[5];
        memset(arr, 0, sizeof(arr)); // sizeof 获取arr数组的大小,这里是将5个元素都设为0,这里memset常用语结构体
        // 以下是接收键盘输入的7个学生的成绩,计算总成绩和平均分
        #include <stdio.h>
        int main(void)
        {
            float arr[7] = {0};
            float sum = 0;
            for (int i = 0; i < 7; i++) {
                printf("请输入第%d个同学的成绩:", i+1);
                scanf("%f", &arr[i]);
                sum += arr[i];
            }
            float average = sum / 7;
            printf("总成绩 = %g, 平均分 = %g\n", sum, average);
            return 0;
        }

二维数组
    二维数组中的每个元素都是一维数组,也就是说二维数组是由多个长度相同的一维数组构成的
    语法:
    数据类型 数组名[分组个数][每组的元素个数]
    int arr[2][2];  // 由两个长度为2的一维数组构成
    注意:
        二维数组中的每个存储区通过组下标(分组个数) 和 组内下标(一维数组的元素下标) 共同确定
        组下标表示具体的分组,从0开始,依次加一
        组内下标表示一组内的具体某个元素对应的下标,从0开始,依次加一
        arr[1][0]; 表示第二组中第一个元素
    二维数组初始化
        未初始化,如上int arr[2][2]; 每个里面的元素在未初始化时,都是随机数
        初始化方法:
          标准初始化:
          int arr[2][2] = {{10,20},{30,40}}; // arr[0][0] = 10 arr[0][1] = 20 arr[1][0] = 30 arr[1][1] = 40
                      初始化0:
              int arr[2][2] = {};
              int arr[2][2] = {{0}, {0}};
              int arr[2][2] = {{0}};
                      其他初始化:
              int arr[3][3] = {{1,2,3},{1,2},{1}}; // 当给数值不全,不全的元素默认设为0
              // arr[0][0~2] 1,2,3  arr[1][0~2] 1,2,0 arr[2][0~2] 1,0,0
              int arr[3][3] = {1,2,3,4,5,6,7,8,9}; // 如果每个每组没有花括号{}区分,name则按照顺序,每个分组依次读取单个组的元素个数作为本组元素
              // arr[0][0~2] 1,2,3  arr[1][0~2] 4,5,6 arr[2][0~2] 7,8,9
              memset方法:
                  int arr[2][2];
                  memset(arr,0,sizeof(arr)); // sizeof 获取arr数组的大小,这里是将二维数组的每个元素都设为0,这里memset常用语结构体
    例:
        #include <stdio.h>
        #include <string.h>
        int main(void)
        {
            // 定义二维数组
            int arr[4][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}, {4,5,6,7,8,9}};
            memset(arr, 0, sizeof(arr));
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j <5; j++) {
                    printf("%d ", arr[i][j]);
                }
                printf("\n");
            }
            return 0;
       }    
    
二、C语言-函数
C语言程序,由函数构成,函数是C代码的基本单位
  无论C语言程序有多少个函数,一定有且只有一个main函数
函数
    函数:是一堆语句的组合,具有独立性和通用性,可以将指定功能封装进函数里面。
    目的:将重复的操作或者公共的操作,代码只写一次,封装为函数,在需要该操作时,直接调用函数即可,无需再写一遍代码。
    比如五子棋,每次落子后,都要重新绘制棋盘,绘制棋盘的代码就可以封装成函数,当需要绘制棋盘的时候,就直接调用函数即可,不需要重复写绘制棋盘代码。
    语法:
    返回值类型 函数名(参数列表) {
        功能代码语句;
    }
        void 作为返回值和参数列表的话,则表示该函数无返回值,无参数列表。
    参数列表可以有多个,根据功能需求设计即可。
        传入的参数保证需函数功能代码需要的,不要添加无效参数。
        语法如下:
        返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, 参数类型3 参数名3,...)
        注意:
            一维数组作为参数,例如 fun(int *array, int len) 或者 fun(int array[], int len) 或者 fun(int array[5], int len)
            // 当数组作为参数时,一般会多加一个参数,表示数组的长度
            二维数组作为参数,例如fun(int arr[][10], int len) 二维数组的列数即第二个中括号的数值,必须指定,否则报错,len 作为行数,即第一个中括号的数值
       
                         例:
            // 该函数返回值为int类型,函数名为findmax,参数为 int指针类型(可表示数组 或者 int类型变量的地址) 和 int类型的数组长度,
        // 功能模块代码就是找数组中最大值,找出最大值后返回,返回值类型为int
        // 每当有需要找数组中最大值的功能,都随时可以调用该函数使用
        #include <stdio.h>
        // 函数的参数也成为形参,即形式上的参数,规定了函数需要的参数类型,当调用函数时,传入的参数会赋值给形参
        int findmax(int* arr, int len)
        {
            int max = arr[0];
            for (int i = 1; i < len; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
            return max;
        }
        int main(void)
        {
            int arr[5] = {1,5,77,8,9};
            int arr1[6] = {1,4,7,9,22,5};
            // 这里findmax(arr, 5) 传入的是实参,相当于 将 main函数里的arr赋值给findmax函数形参中的arr,5赋值给findmax函数形参中的len
            printf("arr max = %d\n", findmax(arr, 5));
            printf("arr1 max = %d\n", findmax(arr1, 6));
            return 0;
        }
    函数的声明
        代码执行顺序:从main函数开始,到return结束
        代码编译顺序:gcc按照从上到下的顺序,逐行编译的
        当调用函数的语句在函数实现的前面时,编译就会报错,找不到函数,warning: implicit declaration of function
        这时可以先声明一下,函数实现可以放后面实现,相当于先给编译器打个招呼,说我有这个函数,后面会实现,调用的时候别给我报错
        例
          #include <stdio.h>
          //函数声明
          int mul(int, int);
          int main(void) {
              // 函数调用
              printf("3 * 5 = %d\n", add(3,5));
              return 0;
        }
        // 函数实现
        int add(int a, int b) {
             return a * b;
        }

http://www.xdnf.cn/news/474877.html

相关文章:

  • 青少年编程与数学 02-019 Rust 编程基础 15课题、错误处理
  • Python连接redis
  • XML简要介绍
  • 模拟jenkins+k8s自动化部署
  • 济南超算研究所面试问题
  • MAX6749KA-T硬件看门狗调试
  • 医学影像系统性能优化与调试技术:深度剖析与实践指南
  • 一台入网的电脑有6要素, 机器名,mac,ip,俺码,网关,dns,分别有什么作用
  • ReinboT:通过强化学习增强机器人视觉-语言操控能力
  • 微信小程序:封装request请求、解决请求路径问题
  • Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发
  • 云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)
  • Kubernetes 1.28 无 Docker 运行时环境下的容器化构建实践:Kaniko + Jenkins 全链路详解
  • 学习threejs,使用Physijs物理引擎,各种constraint约束限制
  • 分布式锁: Redisson 实现分布式锁的原理与技术细节
  • 前端下载ZIP包方法总结
  • 前端取经路——量子UI:响应式交互新范式
  • 第二天的尝试
  • Java + 鸿蒙双引擎:ZKmall开源商城如何定义下一代B2C商城技术标准?
  • 临床决策支持系统的提示工程优化路径深度解析
  • 【SpringBoot】从零开始全面解析SpringMVC (二)
  • TensorFlow/Keras实现知识蒸馏案例
  • Pyhton训练营打卡Day27
  • virtualbox虚拟机中的ubuntu 20.04.6安装新的linux内核5.4.293 | 并增加一个系统调用 | 证书问题如何解决
  • 初识——QT
  • 【Qt】PyQt5 为什么Qt中的字体显示会模糊或呈现像素化
  • Playwright vs Selenium:2025 年 Web 自动化终极对比指南
  • OptiStruct实例:3D实体转子分析
  • 搭建运行若依微服务版本ruoyi-cloud最新教程
  • NLP双雄争霸:GPT与BERT的生成-理解博弈——从技术分野到产业融合的深度解码