4.C语言数组

2 阅读4分钟

数组

是指一组有相同数据类型的数据集合

  • 一维数组

    • 语法:类型说明符 数组名[整形表达式]{={初始化}};
      int a[10];  // 定义一个数组,包含10个int类型元素的数组,数组名为a
      int b[10] = {1,2,3,4,5,6,7,8,9,0};
      
      • 类型说明符:数组元素的类型
      • 数组名:数组名是个标识符,是一个常量,其值是数组的首个元素的地址
      • 整形表达式:指定数组元素的个数(不建议使用变量定义,低版本gcc会报错)
    • 初始化:
      • 全部初始化:
        int b[10] = {1,2,3,4,5,6,7,8,9,0};
        
      • 部分初始化:只初始化前几位,其他数据为0
        int b[10] = {1,2,3,4};
        
      • 对不指定长度的数组,通过初始化赋值,来指定长度
        int c[] = {1,2,3,4};  // 长度为4
        
    • 一维数组元素引用

      一维数组在内存中存放的是在一个连续的地址

      • 引用语法:数组名[下标]
        • 下标就是元素在数组中的位置,应>=0, <=数组长度-1
      int a[4] = {1,2,3,4};
      int num = a[1];
      a[2] = 10;  // 数组赋值
      
    • 数组类型:
      • int a[10]; // a就是 int[10] 类型
  • 多维数组

    • 定义:数组名[表达式1][表达式2]
      int b[2][4] = {1,2,3,4,5,6,7,8};
      int b[2][4] = {{1,2,3,4}, {5,6,7,8}};
      
      • 二维数组,第一个下标是行,第二个下标是列
    • 使用:b[0][2]
  • 字符数组

    • 定义:数组元素类型为char(字符型),可以是一维数组,也可以是二维数组(语法与上面类似)
    • 与字符串的区别
      • 单引号char,双引号字符串:字符串的长度比单字符多一个\0结尾
      char c1[] = {'c', 'h', 'i', 'n', 'a'};
      char c2[] = {"china"};
      
      typeof(c1) == typeof(c2)  ???
      
      c2[0] == 'c'    c1[0] == 'c'
      c2[1] == 'h'    c1[1] == 'h'
      c2[2] == 'i'    c1[2] == 'i'
      c2[3] == 'n'    c1[3] == 'n'
      c2[4] == 'a'    c1[4] == 'a'
      c2[5] == '\0'
      
    • 字符的多维数组就是字符串的数组
      char[][10] = {'123456789', 'abcdefghi'};
      
      #include <stdio.h>
      
      int main()
      {
          char c1[][10] = {"12345679", "abcdefghi"};
      
          printf("c1[0]:%s\n", c1[0]);
          printf("c1[1]:%s\n", c1[1]);
      
          return 0;
      }
      
    • 字符数组操作:
      • 字符串赋值,可以scanf一次全部赋值,其他数据格式不行
    • 代码:
      #include <stdio.h>
      
      int main()
      {
          char str[20] = {0};
      
          scanf("%s", str);
      
          int i = 0;
          while(1){
              char c = str[i];
              if (c>='0' && c<= '9') {
                  printf("%c", c);
              }
              // if (c == 0){
              //     break;
              // }
              i++;
          }
          printf("\n");
      
          return 0;
      }
      
      // 执行后输入输出为:
      23255kk39f
      2325539000
      

      这里scanf直接赋值字符串。
      关于输出结果的结尾000, 是因为while没有设置break条件,数据会一直往后面读,直到超出字符串内存,读取到字符串内存之外的数据,导致程序崩溃了。000就表示刚好超出的内存无数据

      #include <stdio.h>
      
      int main()
      {
          char str[20] = {0};
      
          scanf("%s", str);
      
          int i = 0;
          while(1){
              char c = str[i];
              if (c>='0' && c<= '9') {
                  printf("%c", c);
              }
              // if (c == 0){
              //     break;
              // }
              i++;
          }
          printf("\n");
      
          return 0;
      }
      
      // 执行后输入输出为:
      23255kk39f
      2325539
      

      这里判断 c == 0 作为判断条件,是因为字符串的结尾是 \0,字符正好==0时表示到了字符串结尾。之所以能让char与整数比较,是因为char的本质就是一个小的整数类型(1字节)而\0对应的ascii码就是0.所以能用==

代码练习

  • 写一个计算器,实现输入多个数字进行加减计算
#include <stdio.h>

int main(){
    int numbers[10] = {0};
    char operators[10] = {0};

    while(1){
        int type = 0; // type=0表示输入数字,=1表示输入运算符
        int pos = 0;  // 标记输入了多少位

        printf("请输入数字与运算符(并以=和enter结尾):");
        while(1){
            if (type == 0){
                // 这里接收数字,如果一次输入很长一段文字,就会截取到第一个数字结束:
                // 如输入:1+2+3-4=;就会截取到1
                scanf("%d", &numbers[pos]);
            } else {
                // %c只读取一个字符,其他的输入会进入下一次循环
                // (%s是接收一个字符串,%c接收一个字符,%d接整数)
                scanf("%c", &operators[pos]);

                // 这里判断只接收+-= 这三种符号
                if (operators[pos]!='+' && operators[pos]!='-' && operators[pos]!='=') continue;

                // 这里判断出一个跳出while的条件,为=时表示本次输入结束,要开始计算了
                if (operators[pos] == '=') break;
                pos++;
            }
            type = !type;
        }

        // 累加计算
        int result = numbers[0];
        for (int i=0; i<=pos; i++){
            switch(operators[i]){
                // 这里只支持+- 计算
                case '+':
                    // 这里使用i+1是因为数字总是比运算符多一位,第一位已经赋值给result了。
                    result += numbers[i+1];
                    break;
                case '-':
                    result -= numbers[i+1];
                    break;
            }
        }
        printf("result:%d\n", result);

    }

    return 0;
}
运行结果:
PS C:\Users\86176\Desktop\嵌入式\c语言\ccode\class3> .\str.exe
请输入数字与运算符(并以=和enter结尾):1+2+3+4=
result:10
请输入数字与运算符(并以=和enter结尾):1+2+3+4-5=
result:5
请输入数字与运算符(并以=和enter结尾):1+2+3+ x4=
result:10
请输入数字与运算符(并以=和enter结尾):