# 数组和字符串

# 概述

数组是一种数据结构,它是一组连续的内存空间,用来存储一组具有相同类型的数据。

  • 数组的每个元素都是相同的数据类型,可以是基本数据类型,也可以是引用数据类型。并且所有成员在内存中是连续存储的。
  • 数组的长度是固定的,一旦创建,长度就不可改变。
  • 数组元素类型不同,数组可分为:数值型数组、字符型数组、布尔型数组、引用类型数组等。
  • 数组的下标个数称为数组的维数,数组的维数可以是1维、2维、3维等。

# 一维数组

# 定义和使用

  • 一维数组的定义格式:数据类型 数组名[数组长度]
  • 一维数组的初始化格式:数据类型 数组名[数组长度] = {元素1, 元素2, ...}
  • 一维数组的访问格式:数组名[下标]

TIP

  • 数组的下标从0开始,到数组长度-1结束。
  • 数组的长度必须是一个常量,不能是变量。
  • 数组的长度可以省略,但是必须初始化。
  • 数组名不能与其他变量名重复。同一个作用域内,不能有两个名字相同的变量。
#include <stdio.h>

int main() {

    //定义一个长度为5的整型数组
    int arr[5];
    //定义一个长度为5的整型数组,并初始化
    int arr2[5] = {1, 2, 3, 4, 5};
    //定义一个长度为5的整型数组,并初始化
    int arr3[5] = {1, 2, 3};
    //定义一个长度为5的整型数组,并初始化
    int arr4[5] = {0};
    //定义一个长度为5的整型数组,并初始化
    int arr5[] = {1, 2, 3, 4, 5};

    //访问数组元素
    printf("%d\n", arr2[0]);    //1
    printf("%d\n", arr2[1]);    //2
    printf("%d\n", arr2[2]);    //3
    printf("%d\n", arr2[3]);    //4
    printf("%d\n", arr2[4]);    //5

    return 0;
}

# 案例

# 数组最大值

#include <stdio.h>

int main() {

    int arr[5] = {1, 2, 3, 4, 5};

    int max = arr[0];
    for (int i = 1; i < 5; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }

    printf("max = %d\n", max);

    return 0;
}

# 数组逆置

#include <stdio.h>

int main() {

    int arr[5] = {1, 2, 3, 4, 5};

    int temp;
    for (int i = 0; i < 5 / 2 ; i++) {
        temp = arr[i];
        arr[i] = arr[4 - i];
        arr[4 - i] = temp;
    }

}

# 二维数组

# 定义和使用

  • 二维数组的定义格式:数据类型 数组名[行数][列数]
  • 二维数组的初始化格式:数据类型 数组名[行数][列数] = {{元素1, 元素2, ...}, {元素1, 元素2, ...}, ...}
  • 二维数组的访问格式:数组名[行下标][列下标]
  • 二维数组的行数和列数都必须是常量,不能是变量。

TIP

  • 二维数组的行数和列数都必须是常量,不能是变量。
  • 二维数组的行数和列数可以省略,但是必须初始化。
  • 内存中并不存在二维数组,二维数组在内存中是以一维数组的形式存储的。
#include <stdio.h>

int main() {

    //定义一个3行4列的整型数组
    int arr[3][4];
    //定义一个3行4列的整型数组,并初始化
    int arr2[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11}};
    //定义一个3行4列的整型数组,并初始化
    int arr3[3][4] = {1, 2, 3, 4, 5, 6, 7, 8};
    //定义一个3行4列的整型数组,并初始化
    int arr4[3][4] = {0};
    //定义一个3行4列的整型数组,并初始化
    int arr5[][4] = {1, 2, 3, 4, 5, 6, 7, 8};

    //访问数组元素
    printf("%d\n", arr2[0][0]);    //1
    printf("%d\n", arr2[0][1]);    //2
    printf("%d\n", arr2[0][2]);    //3
    printf("%d\n", arr2[0][3]);    //4
    printf("%d\n", arr2[1][0]);    //5
    printf("%d\n", arr2[1][1]);    //6
    printf("%d\n", arr2[1][2]);    //7
    printf("%d\n", arr2[1][3]);    //8
    printf("%d\n", arr2[2][0]);    //9
    printf("%d\n", arr2[2][1]);    //10
    printf("%d\n", arr2[2][2]);    //11
    printf("%d\n", arr2[2][3]);    //0

    return 0;
}

# 案例

# 二维数组逆置

#include <stdio.h>

int main() {

    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11}};

    int temp;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4 / 2; j++) {
            temp = arr[i][j];
            arr[i][j] = arr[i][3 - j];
            arr[i][3 - j] = temp;
        }
    }

    return 0;
}

# 二维数组打印


#include <stdio.h>

int main() {

    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11}};

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

# 字符数组与字符串

# 区别:

  • C语言中没有字符串类型,字符串是用字符数组来表示的。
  • 字符数组是一种特殊的一维数组,用来存储字符串。
  • 字符串是以'\0'结尾的字符数组。
  • 字符串的长度是不包含'\0'的长度。

# 定义和使用

  • 字符数组的定义格式:数据类型 数组名[数组长度]
  • 字符数组的初始化格式:数据类型 数组名[数组长度] = "字符串"
  • 字符数组的访问格式:数组名[下标]

#include <stdio.h>

int main() {

    //定义一个长度为5的字符数组
    char arr[5];
    //定义一个长度为5的字符数组,并初始化
    char arr2[5] = {'h', 'e', 'l', 'l', 'o'};
    //定义一个长度为5的字符数组,并初始化
    char arr3[5] = "hello";
    //定义一个长度为5的字符数组,并初始化
    char arr4[] = "hello";

    //访问数组元素
    printf("%c\n", arr2[0]);    //h
    printf("%c\n", arr2[1]);    //e
    printf("%c\n", arr2[2]);    //l
    printf("%c\n", arr2[3]);    //l
    printf("%c\n", arr2[4]);    //o

    return 0;
}

# 字符串的输入输出

C语言中没有提供直接输出字符串的函数,需要使用循环来输出字符串。


#include <stdio.h>

int main() {

    char arr[] = "hello";

    //输出字符串
    for (int i = 0; i < 5; i++) {
        printf("%c", arr[i]);
    }
    printf("\n");

    //输入字符串
    for (int i = 0; i < 5; i++) {
        scanf("%c", &arr[i]);
    }
    printf("%s\n", arr);

    return 0;
}
函数 说明 参数 返回值
gets() 用来输入字符串,可以输入空格,以回车结束。 char *s :指向用来存储输入字符串的数组。 char * :返回输入的字符串。
puts() 用来输出字符串,输出完毕后会自动换行。 char *s :指向要输出的字符串。 int :返回输出的字符个数。
fgets() 用来输入字符串,可以输入空格,以回车结束。 char *s :指向用来存储输入字符串的数组。 int n :最多读取的字符个数。 FILE *stream :指向要读取的文件。 char * :返回输入的字符串。
fputs() 用来输出字符串,输出完毕后不会自动换行。 char *s :指向要输出的字符串。 FILE *stream :指向要写入的文件。 int :返回输出的字符个数。
scanf() 用来输入字符串,以空格、制表符、换行符结束。 char *format :格式控制字符串。 ... :要输入的字符串。 int :返回成功匹配并赋值的个数。
strlen() 用来计算字符串的长度,不包含 \0 char *s :指向要计算的字符串。 int :返回字符串的长度。
  • gets()函数:用来输入字符串,可以输入空格,以回车结束。

TIP

  • gets()函数会自动在输入的字符串末尾添加\0
  • gets()函数会自动忽略回车键。
  • puts()函数:用来输出字符串,输出完毕后会自动换行。

TIP

  • puts()函数会自动在输出的字符串末尾添加\n
#include <stdio.h>

int main() {

    char arr[100];

    //输入字符串
    gets(arr);
    //输出字符串
    puts(arr);

    return 0;
}
  • fgets()函数:用来输入字符串,可以输入空格,以回车结束。

TIP

  • fgets()函数会自动在输入的字符串末尾添加\0
  • fgets()函数会自动忽略回车键。
  • fputs()函数:用来输出字符串,输出完毕后不会自动换行。

TIP

  • fputs()函数会自动在输出的字符串末尾添加\n
#include <stdio.h>

int main() {

    char arr[100];

    //输入字符串
    fgets(arr, 100, stdin);
    //输出字符串
    fputs(arr, stdout);

    return 0;
}
  • scanf()函数:用来输入字符串,以空格、制表符、换行符结束。

TIP

  • scanf()函数会自动在输入的字符串末尾添加\0
#include <stdio.h>

int main() {

    char arr[100];

    //输入字符串
    scanf("%s", arr);
    //输出字符串
    printf("%s\n", arr);

    return 0;
}
  • strlen()函数:用来计算字符串的长度,不包含 \0

TIP

  • strlen()函数不会自动在输入的字符串末尾添加\0

#include <stdio.h>

int main() {

    char arr[] = "hello";

    printf("%d\n", strlen(arr));

    return 0;
}

# 案例

# 字符串添加

  #include <stdio.h>

  int main() {

      char arr[100] = "hello";

      //输入字符串
      scanf("%s", arr);
      //输出字符串
      printf("%s\n", arr);

      return 0;
  }