当前位置:首页 > 技术 > 正文内容

C语言数组与函数详解

访客 技术 2026年7月31日 1

第 10 章 数组

10.1 数组概述

数组的四大要素

  • 数组名:标识符常量,需遵循命名规则。
  • 元素:数组内所有元素的类型必须相同。
  • 下标:从0开始的连续整数,用于访问元素。
  • 长度:数组中元素的总个数。

C语言数组特性

  • 内存中分配连续空间,大小由长度和元素类型决定。
  • 元素在内存中紧密排列,保持原有顺序。
  • 数组长度一旦确定(初始化后),则不可更改。元素值可以修改。
  • 通过下标可快速直接访问任一元素。

注意:不允许给数组名重新赋值。

10.2 数组操作

10.2.1 数组定义与初始化

  • 方式一(先声明后赋值):指定类型和长度,再通过下标赋值。
    int arr1[5];
    arr1[0] = 100;
  • 方式二(声明同时初始化):指定类型、长度并初始化。
    double arr2[4] = {1.4, 2.5, 3.3, 4.9};
  • 方式三(省略长度初始化):指定类型,省略长度,必须同时初始化。
    short arr3[] = {10, 20, 30, 40, 50, 60, 70, 80};

10.2.2 访问数组元素

使用 `数组名[下标]` 进行访问。

10.2.3 数组越界访问

访问越界会导致读取到不确定的"垃圾值"。

10.2.4 计算数组长度

// 方法一
int length = sizeof(arr) / sizeof(arr[0]);
// 方法二
int length = sizeof(arr) / sizeof(int); // 假设数组元素为 int 类型

10.2.5 遍历数组

// 假设数组长度为 len
for (int i = 0; i < len; i++) {
    // 访问数组元素 arr[i]
    printf("%d ", arr[i]);
}

注意:C99标准支持使用变量表示数组长度,例如 `int nums[len];`。

10.3 字符数组(字符串)

10.3.1 字符串的本质

字符串本质上是 `char` 类型的一维数组,并在末尾自动添加一个空字符 `\0` 作为结束标记。

10.3.2 字符串定义

  • 手动添加 `\0`:
    char msg1[8] = {'B', 'e', 'i', 'j', 'i', 'n', 'g', '\0'};
  • 自动添加 `\0`:
    char msg2[9] = "Shanghai"; // 自动添加 \0,数组大小为9
  • 简化写法(推荐):
    char msg1[] = "Beijing"; // 编译器自动计算长度并添加 \0
    char msg2[] = "Hello World"; // 编译器自动计算长度并添加 \0

10.3.3 字符串的访问与遍历

可以通过下标访问单个字符,并使用 `%s` 格式化符进行整体输出和遍历。

10.4 多维数组

10.4.1 二维数组定义与初始化

  • 方式一(声明后赋值):
    double arr1[3][2];
    arr1[0][0] = 10.0; // ...
  • 方式二(声明同时初始化):
    int arr2[2][3] = {{10, 20, 30}, {100, 200, 300}};
  • 方式三(省略内层括号):
    int arr3[3][4] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120};
  • 方式四(省略行数):
    int arr4[][4] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120};

10.4.2 二维数组访问与遍历

访问元素需使用 `数组名[行下标][列下标]`。遍历通常使用嵌套循环。

二维字符串示例(字符串数组):

char cities[3][10] = {"New York", "London", "Paris"};

for (int i = 0; i < 3; i++) {
    printf("%s\n", cities[i]); // 使用 %s 打印整个字符串
}

第 11 章 函数

11.1 函数基本概念

函数是实现特定功能的代码块。分为库函数和自定义函数。

11.2 函数基本语法

11.2.1 函数声明(定义)

函数包含四要素:函数名、函数体(`{}` 中的代码)、返回值类型、参数列表(形参)。

注意:C语言不允许函数嵌套定义。

11.2.2 调用函数

使用 `函数名()` 进行调用。函数体内的代码仅在被调用时执行。函数调用的表达式的值即为函数的返回值。

11.2.3 返回值

  • 有返回值:返回类型需与 `return` 语句后的表达式类型一致,否则会发生类型转换。
  • 无返回值:函数返回类型声明为 `void`。函数体内可省略 `return` 语句,或使用 `return;` 结束函数。
  • `return` 语句不仅能返回值,还能终止当前函数的执行。

11.2.4 参数

  • 形参:函数声明时定义的参数,是函数内部的局部变量。
  • 实参:函数调用时传递的参数,用于给形参赋值。实参与形参的数量必须一致。

注意:C语言函数参数传递是"值传递",即函数内部对形参的修改不会影响到外部实参。若要修改外部变量,需传递指针。

// 形参示例
void processData(int count) { // count 是形参
    // 在函数内部可以访问和修改 count 的值
    count = count * 2;
    printf("Inside function: %d\n", count);

    // 函数内部定义的局部变量
    const double PI_VALUE = 3.14159;
    char message[] = "Processing...";
    printf("PI = %.5lf, Message = %s\n", PI_VALUE, message);
}

总结

  • 数组:由四要素(名、元素类型、下标、长度)构成,提供连续内存空间,通过下标快速访问。
  • 数组操作:包括定义、初始化、访问、越界处理、长度计算和遍历。
  • 字符数组(字符串):以 `\0` 结尾的 `char` 数组,支持特殊格式化符 `%s`。
  • 多维数组:用于表示行列结构等,通过多重下标访问,常用于二维字符串等场景。
  • 函数:封装可重用代码块,有声明、定义、调用、返回值和参数等概念。参数传递默认是值传递。
标签: C语言数组

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。