当前位置: 首页 > 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;
        }

相关文章:

  • 深入解析Spring Boot与微服务架构:从入门到实践
  • 智能呼叫系统中的NLP意图理解:核心技术解析与实战
  • Android 中 打开文件选择器(ACTION_OPEN_DOCUMENT )
  • 基于React的高德地图api教程005:圆形标记的绘制、删除、修改
  • 0-INViT:一个具有不变嵌套视图Transformer的可推广路由问题求解器(code)(未完)
  • GDB 高级调试技术深度解析
  • 【Python+flask+mysql】网易云数据可视化分析(全网首发)
  • STM32F103经SPI总线向写Micro SD卡
  • 怎么使用python进行PostgreSQL 数据库连接?
  • Web性能优化的未来:边缘计算、AI与新型渲染架构
  • WebMvcConfigurer介绍-笔记
  • 算法刷题(Java与Python)1.二分查找
  • 车道线检测----CLRERNet
  • 【云实验】基于对象存储OSS实现企业门户网站托管
  • RNope:结合 RoPE 和 NoPE 的长文本建模架构
  • 如何解决Move to iOS 不起作用的问题?
  • 车道线检测----CLRNet
  • C语言图案代码大全:从基础到高级
  • Recycling Krylov Subspace 方法解释与开源实现
  • ECMAScript标准:JavaScript的核心
  • 贞丰古城:新垣旧梦间的商脉与烟火
  • 张广智︱“编年事辑”:打开学人心路历程的窗户
  • “中国神湖”加快放大资源规模!3亿美元换海外年产380万吨钾盐项目
  • 微软将在全球裁员6000人,目标之一为减少管理层
  • 台行政机构网站删除“汉人”改为“其余人口”,国台办回应
  • 七旬男子驾“老头乐”酒驾被查,曾有两次酒驾两次肇事记录