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

C语言数组与函数核心知识总结

第一部分:数组

数组是一种存储多个相同类型元素的集合,是C语言中最重要的数据结构之一。

. 一维数组

创建type arr_name[常量值];

例如:int math[20];用于存储20个整数。

  • 初始化:创建时给定初始值。

    • 完全初始化int arr[5] = {1, 2, 3, 4, 5};

    • 不完全初始化:剩余元素自动初始化为0。int arr2[6] = {1};

    • 省略大小:数组初始化时可省略大小,编译器自动计算。int arr[] = {1,2,3};

  • 使用:通过下标访问元素,下标从0开始。

    • 访问:arr[7]

    • 遍历:通过for循环配合下标遍历所有元素。

  • 内存存储:数组元素在内存中连续存储。通过打印地址可以发现,相邻元素地址差等于单个元素类型大小(如整型差4字节)。

  • 计算元素个数:使用sizeof操作符。

    • sizeof(arr):计算数组总字节大小。

    • sizeof(arr) / sizeof(arr[0]):计算数组元素个数。这是一个常用技巧,可提高代码适应性。

    • 2. 二维数组
    • 概念:一维数组作为元素构成的数组,可理解为矩阵。

    • 创建type arr_name[行数][列数];

      • 例如:int arr[3][5];创建一个3行5列的整型数组。

    • 初始化

      • 按行完全初始化int arr[3][5] = {{1,2}, {3,4}, {5,6}};

      • 按顺序初始化int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

      • 省略行,不可省略列int arr[][5] = {1,2,3,4,5,6,7};编译器会自动推算行数。

    • 使用:通过行下标列下标访问元素,均从0开始。

      • 访问:arr[2][4]

      • 遍历:使用双层嵌套for循环。

    • 3. 变长数组(C99)
    • 概念:数组长度可以用变量指定,在运行时确定。

    • 语法int arr[n];(n为变量)。

    • 限制不能初始化,且并非所有编译器完全支持(如VS2022不支持,但gcc支持)。

    • 4. 练习案例
    • 二分查找:在升序数组中高效查找指定值。通过定义左(left)、右(right)边界和中间(mid)下标,每次比较后缩小一半搜索范围。

    • 内存存储:二维数组在内存中同样连续存储,按行顺序排列。arr[0][4]arr[1][0]地址相邻。

    • 第二部分:函数

      函数是完成特定任务的一段代码,是C程序的基本模块,支持代码复用模块化

      1. 函数分类
    • 库函数:由C语言标准库或编译器厂商提供,如printf,scanf,sqrt。使用前需包含对应头文件(如#include <stdio.h>)。

    • 自定义函数:程序员根据需要自己编写的函数。

    • 返回类型 函数名(参数列表) {
      // 函数体
      return 返回值; // 可选
      }

    • 形参(形式参数):定义函数时括号中的变量,用于接收值。

    • 实参(实际参数):调用函数时传递给函数的具体值。

    • 3. 数组作为函数参数
    • 传递方式:将数组名作为参数传递。

    • 关键特性

      1. 形参接收数组时,可写成数组形式,如int arr[]

      2. 一维数组形参,数组大小可以省略

      3. 二维数组形参,行可以省略,但列不能省略,如int arr[][5]

      4. **最重要的一点:数组传参时,形参不会创建新数组,形参操作的数组与实参数组是同一块内存空间。因此函数内对数组元素的修改会影响原数组。

    • 关键点:形参是实参的一份临时拷贝,两者占用不同的内存空间。

    • 4. 函数调用方式
    • 嵌套调用:函数之间互相调用,例如函数A内部调用函数B。

    • 链式访问:将一个函数的返回值作为另一个函数的参数,如printf("%d\n", strlen("abc"));

    • 5. 函数的声明与定义
    • 声明:告诉编译器函数的名字、参数和返回类型。写在调用之前,通常放在头文件(.h)中。格式:int Add(int, int);int Add(int x, int y);

    • 定义:函数的具体实现。通常放在源文件(.c)中。

    • 原则:函数需先声明后使用。将定义放在调用之前,等价于声明+定义。

    • 代码的拆分好处

    • 1.一定程度上隐藏代码

    • 2.方便多人协作

    • 3.代码模块化

    • 创建静态库.lib.隐藏代码

    • 6. 作用域、生命周期与staticextern关键字
    • static关键字

      • 修饰局部变量:改变其存储位置(从栈区到静态区),从而改变生命周期(使其在程序运行期间一直存在),但不改变作用域。常用于函数调用间保留状态。

      • 修饰全局变量/函数:改变其链接属性(从外部链接变为内部链接),使其作用域限制在本源文件内部,无法被其他源文件通过extern声明使用。用于隐藏实现细节。

    • extern关键字:用于声明在其他源文件中定义的全局变量或函数,表示“此标识符定义在外”。

    • 作用域:变量/标识符的有效代码范围。

      • 局部变量:所在局部范围(如函数内)。

      • 全局变量:整个工程。

    • 生命周期:变量从创建到销毁的时间段。

      • 局部变量:进入作用域开始,离开作用域结束。

      • 全局变量:整个程序运行期间。


    • 核心关联与编程思想

    • 数据与操作的结合数组是组织数据的强大容器,而函数是对这些数据进行操作的模块。二者结合是构建复杂程序的基础。

    • 模块化与封装:函数将特定功能封装,使主程序逻辑清晰。static关键字能进一步加强模块的封装性,隐藏内部数据与函数。

    • 效率与复用:通过函数复用代码,通过数组高效存储和管理批量同类数据。二分查找算法是数组与逻辑结合提升性能的典范。

    • 内存视角理解:理解数组的连续存储和函数参数传递的值拷贝(普通变量)与地址关联(数组)机制,是深入理解C语言内存操作的关键。

http://www.cnnetsun.cn/news/2112580.html

相关文章:

  • WinUtil:Windows系统管理的终极免费工具箱,一键解决软件安装、系统优化难题
  • 从零搭建一个轻量级视频监控平台:用wvp-pro + ZLMediaKit管理你的NVR和IPC
  • 快速上手VMware Unlocker:3步完成macOS虚拟机安装的完整教程
  • Open WebUI:构建企业级本地AI平台的架构实践
  • 别再乱搜了!Mac+VS Code+LaTeX环境搭建,这份避坑指南能解决你90%的编译问题
  • i茅台自动预约完整指南:如何用Java技术告别手动抢购烦恼
  • Windows蓝屏0xE6?别慌,手把手教你用WinDbg定位NVIDIA显卡驱动的DMA违规问题
  • 3分钟掌握Onekey:解决Steam游戏清单获取难题的终极方案
  • Windows安卓应用安装终极指南:如何用APK-Installer告别模拟器时代
  • 设计系统实战:从原子设计到工程化落地的完整指南
  • C ++输入输出基础教程示例详解
  • 计算机毕业设计Python+Tensorflow农产品价格预测系统 农产品价格分析可视化(源码+LW+PPT+讲解)
  • NXDumpTool核心功能解析:Switch游戏转储工具使用全攻略
  • 别再死记硬背节点了!用Substance Designer做写实泥土材质,从‘大结构’到‘鹅卵石’的保姆级拆解
  • 运用qsort函数对任意数据进行排序
  • 网络编程模型比较
  • 从BUCK到BOOST:手把手教你用LTspice仿真DCDC三大拓扑,搞定电感电容选型难题
  • 三步彻底解锁惠普OMEN游戏本性能:OmenSuperHub终极指南
  • 魔兽世界宏编辑器终极指南:3个步骤让你告别复杂技能循环
  • 算法训练营第十四天| 18.四数之和
  • 别再傻傻分不清了!一文讲透SAP FICO里的替代、校验、BTE和出口增强到底怎么选
  • Neuron-AI:专为边缘计算打造的高性能AI推理引擎实战指南
  • APKMirror:如何打造你的Android应用时光机?终极免费解决方案揭秘
  • 每日极客日报 · 2026年04月27日
  • 暗黑破坏神2存档编辑器完全手册:5分钟掌握角色定制终极技巧
  • 抖音视频批量下载完整指南:如何快速保存喜欢的短视频内容
  • 【MySQL 数据库】环境安装教程
  • 终极教程:3步用Photon-GAMS光影包将Minecraft变成电影级视觉盛宴
  • Unlock Music:浏览器端音乐格式解密的架构设计与工程实践
  • NCCL Inspector:分布式AI训练通信性能观测与优化