JavaScript is required
首页博客列表搜索 RSS 订阅 Beta
Return to List

C 语言数组 & 函数

Notes: 这是一篇测试文章:

C 语言数组

数组的定义

与定义变量类似,定义数组只需在数组名字后面添加一对中括号 [] 既可:

c
int array[10];

注意:中括号里面是数组的长度(元素的数量)。这是一个固定长度的数组,如需用到动态长度数组,可以用 C++ 的 STL 。(后续学长会讲)

我们刚刚定义的数组中显然可以容纳 10 个 int 类型的数字。

数组的初始化

我们现在定义的数组是一个空数组,需要对其进行初始化来填充数据:

c
array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

大括号中的元素数量不能超过数组的容量。

另外,在定义数组时也可以省略数组的容量,但是必须在定义的同时对其初始化:

c
int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

这段代码定义的数组和前例定义的数组完全相同!

此外也可以单独给其中某个元素赋值:

c
array[5] = 0;

这段代码会将数组中第六个元素的值置为 0(为什么是第六个后面会讲)。

访问数组中的元素

所有的数组都是以 0 来作为它们第一个元素的索引值。因此,数组的最后一个元素索引为就是 数组总大小1\text{数组总大小} - 1

访问数组元素可以通过数组名称加索引来进行访问,例如:

c
printf("%d", array[5]);

DEMO

这个 DEMO 实现了以下功能:

  • 从输入的第 11 行获取数组的长度 NN .
  • 随后的 NN 行输入为 a1a_1ana_n ,表示数组的每个元素.
  • 随后程序输出数组的每个元素的值,中间以空格隔开.
c
#include "bits/stdc++.h"

int a[10001]; // 这里保证数组的长度足够大,避免输入数组过长

int main() {
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    for(int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
}

获取数组长度

可以使用 sizeof() 运算符(这不是函数)来获取数组的大小。

但是需要注意的是,sizeof() 运算符返回的是数组的 Byte 数,如果需要得到数组的长度,需要用

数组的Byte数数组中任意一个元素的Byte数\frac{\text{数组的Byte数}}{\text{数组中任意一个元素的Byte数}}

这个式子来计算。来看下例:

c
#include <stdio.h>

int main() {
    int array[] = {1, 2, 3, 4, 5};
    int length = sizeof(array) / sizeof(array[0]);
    printf("数组长度为: %d\n", length);
}

多维数组

多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:

c
int array[10][10];

此例定义了一个 101010*10 的二维数组。

多维数组也可以在定义时直接初始化:

c
int a[3][4] = {
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};

C 语言函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

C 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。

下面这个例子定义了一个简单的判断平年闰年的函数:

c
int isRun(int year) {
    return (year % 400 == 0 || year % 4 == 0 && year % 100 != 0);
}

我们来简单介绍一下这个函数的各个部分:

  • 返回类型:一个函数可以返回一个值,也可以不返回值(此时返回类型填 void),这里我们需要返回 0 和 1,所以类型选择 int 或者 char
  • 函数名称:略;
  • 函数参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体: 函数主体包含一组定义函数执行任务的语句。

函数的参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有两种向函数传递参数的方式:

调用类型描述
传值调用该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。

Examples

数组

函数

Practice

https://acm.sdut.edu.cn/onlinejudge3/sets/11 中的数组和函数部分。