首页 > 其他分享 >C 语言-3 数组

C 语言-3 数组

时间:2022-08-17 15:33:50浏览次数:67  
标签:字符 下标 语言 元素 数组名 数组 字符串

3 数组

  • 具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组
  • 在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型
  • 按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别

3.1 一维数组

  • 定义:

    • 格式:

      类型说明符 数组名[常量表达式];
      
      • 类型说明符:任一种基本数据类型或构造数据类型

      • 数组名:用户定义的数组标识符

      • 方括号中的常量表达式:表示数据元素的个数,也称为数组的长度

    • 示例:

      int a[19];
      
    • 注意:

      1. 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的

      2. 数组名的书写规则应符合标识符的书写规定

      3. 数组名不能与其它变量名相同

      4. 方括号中常量表达式表示数组元素的个数,下标从 0 开始计算

      5. 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式

        #define FD 5
        main(){ 
            int a[3+2],b[7+FD];
            ……
        }
        
      6. 允许在同一个类型说明中,说明多个数组和多个变量

        int a,b,c,d,k1[10],k2[20];
        
  • 引用:

    • 一般形式:

      数组名[下标]
      

      下标只能为整型常量或整型表达式。如为小数时,C 编译将自动取整

    • 在C语言中只能逐个地使用下标变量,而不能一次引用整个数组

      • 数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量
    • 示例:输出有 10 个元素的数组逐个输出各下标变量
      正确访问:

      for(i=0; i<10; i++)
          printf("%d",a[i]);
      

      错误访问:

      printf("%d",a[i]);
      
  • 初始化:

    • 给数组赋值的方法:用赋值语句对数组元素逐个赋值、初始化赋值动态赋值

    • 数组初始化赋值:在数组定义时给数组元素赋予初值

      • 一般格式:

        类型说明符 数组名[常量表达式]={值,值……值};
        

        { }中的各数据值即为各元素的初值,各值之间用逗号间隔

      • 优点:数组初始化是在编译阶段进行,这样将减少运行时间,提高效率

      • 示例:

        int a[10]={1,2,3,4,5,6,7,8,9,0};
        
    • 相关约定:

      1. 可以只给部分元素赋初值:{} 内地元素可以少于 [] 指定地数量

      2. 只能给元素逐个赋值,不能给数组整体赋值

      3. 如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数

        int a[] = {1,2,4,5,76,78,1} //等价于 int a[7] = {1,2,4,5,76,78,1}
        
  • 示例:

    main()
    {
        int i,max,a[10];
        printf("input 10 numbers:\n");
        for(i=0;i<10;i++)
            scanf("%d",&a[i]);
        max=a[0];
        for(i=1;i<10;i++)
            if(a[i]>max) max=a[i];
        printf("maxmum=%d\n",max);
    }
    
    • 这个示例也展示了动态赋值

3.2 二维数组

  • 定义

    • 格式:

      类型说明符 数组名[常量表达式 1][常量表达式 2];
      
      • 常量表达式 1:表示第一维度下标长度
      • 常量表达式 2:表示第二维度下标长度
    • 示例:

      int a[3][4];
      //表示为:
      //a[0][0],a[0][1],a[0][2],a[0][3]
      //a[1][0],a[1][1],a[1][2],a[1][3]
      //a[2][0],a[2][1],a[2][2],a[2][3]
      

      一个三行四列的数组,数组名为 a,其下标变量的类型为整型。该数组的下标变量共有 3×4 个

  • 存储:二维数组在概念上是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,在实际的硬件存储器是连续编址的,也就是说存储器单元是按一维线性排列的

    • 存放二维数组,有两种方式:
      1. 按行排列, 即放完一行之后顺次放入第二行
      2. 按列排列, 即放完一列之后再顺次放入第二列
    • 在C语言中,二维数组是按行排列的
      • 即示例中: 先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行。每行中有四个元素也是依次存放。由于数组 a 说明 为 int 类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节
  • 引用:

    • 一般形式:

      数组名[下标][下标]
      

      下标应为整型常量或整型表达式

  • 初始化:

    • 二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值

      • 示例:对 数组 a[5][3] 进行赋值

        //按行分段赋值
        int a[5][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}};
        //连续赋值
        int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        
    • 相关约定:

      1. 可以只给部分元素赋初值,未赋初值的元素自动取 0 值

      2. 如给全部元素赋值,则第一维的长度可以不给出

        int a[][3]={1,2,3,4,5,6,7,8,9}; //等价于 int a[3][3]={1,2,3,4,5,6,7,8,9};
        
      3. 二维数组可以看作是由一维数组的嵌套而构成的

        • 设一维数组的每个元素都又是一个数组,就组成了二维数组。前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解

          • 示例:a[3][4] 分解为三个一维数组,三个数组名为:a[0] a[1] a[2]

            这三个一维数组不需另作说明即可使用。这三个一维数组都有 4 个元素

            例如:一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]

            • 注意:a[0]、a[1]、a[2] 不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量

3.3 字符数组

  • 存放字符量的数组称为字符数组

  • 定义:

    • 形式与前面介绍的数值数组相同

    • 示例:

      char a[10];
      char b[5][10];
      

      因为字符型和整型通用,也可以定义为 int a[10] ,但这时每个数组元素占 2 个字节的内存单元

  • 初始化:

    • 示例:

      char a[10]={"c", " ", "p", "r", "o", "g", "r", "a","m"};
      
    • 当对全体元素赋初值时也可以省去长度说明

  • 字符串结束标志

    • 在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以 '\0' 作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0' 存入数组, 并以此作为该字符串是否结束的标志

      • 有了 '\0' 标志后,就不必再用字符数组的长度来判断字符串的长度了
    • C语言允许用字符串的方式对数组作初始化赋值

      • 即上面的示例可以修改为:

        char a[]={"C program"};
        //或者
        char a[]="C program";
        
    • 用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志 '\0'

      • 上面的数组 a 在 内存中的实际存放情况为:
        image-20220727203055178

        '\0'是由 C 编译系统自动加上的。由于采用了'\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理

  • 输出输入

    • 除了字符串赋初值的办法外,还可用 printf 函数和 scanf 函数一次性输出输入一个字符数组中的字符串,而不使用循环语句逐个地输入输出每个字符

    • 示例:

      main(){
          char a[]='BASIC\ndBASE';
          printf("%s\n",a);			//不能写为:printf("%s",a[]);
      }
      

      在 printf 函数中,使用的格式字符串为 '%s',表示输出的是一个字符串。而在输出表列中给出数组名则可

    • 注意:当用 scanf 函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符

    • 在C语言中规定,数组名代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元

      • 设数组 a 的首地址为 2000,也就是说 a[0] 单元地址为 2000。则数组名 a 就代表这个首地址。因此在 a 前面不能再加地址运算符 &。如写作 scanf("%s",&a); 是错误的
      • 在执行函数 printf("%s",a) 时,按数组名 a 找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志 '\0' 为止
  • 字符处理函数

    • C语言提供大致可分为字符串的输入、输出、合并、修改、比较、转换、复 制、搜索几类函数

    • 头文件:string.h

    • 常见的字符串函数

      函数 函数名 格式 作用 说明
      puts 字符串输出函数 puts (字符数组名) 将字符数组中的字符串输出到显示器 1. puts 函数中可以使用转义字符
      2. puts 函数完全可以由 printf 函数取代。当需要按一定格式输出时,通常使用 printf 函数
      gets 字符串输入函数 gets (字符数组名) 从标准输入设备键盘上输入一个字符串 gets 函数并不以空格作为字符串输 入结束的标志,而只以回车作为输入结束(当输入的字符串中含有空格时,输出仍为全部字符串)
      strcat 字符串连接函数 strcat(字符数组名 1,字符数组名 2) 将字符数组 2 中的字符串连接到字符数组 1 中字符串的后面,并删去字符串 1 后的串标志 '\0' 要注意字符数组 1 应定义足够的长度,否则不能全部装入被连接的字符串
      strcpy 字符串拷贝函数 strcpy (字符数组名 1,字符数组名 2) 将字符数组 2 中的字符串拷贝到字符数组 1 中。串结束标志“\0”也一同拷贝 1. 字符数名 2,也 可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组
      2.要求字符数组 1 应有足够的长度,否则不能全部装入所拷贝的字符串
      strcmp 字符串比较函数 strcmp(字符数组名 1,字符数组名 2) 按照 ASCII 码顺序比较两个数组中的字符串,并由函数返回值返回比较结果(相等,返回 0;1<2,返回<0;1>2,返回>0) 也可用于比较两个字符串常量,或比较数组和字符串常量
      strlen 测字符串长度函数 strlen(字符数组名) 测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值

标签:字符,下标,语言,元素,数组名,数组,字符串
From: https://www.cnblogs.com/handsome-black/p/16595404.html

相关文章

  • 汇编语言-王爽第四版,学习资料和姿势
    'debug'不是内部或外部命令,也不是可运行的程序或批处理文件。debug:无法将“debug”项识别为cmdlet、函数、脚本文件或可运行程序的名称。windows,win10,win11找不到......
  • go语言实现无限级分类
    packagemainimport( "fmt" "gorm.io/gorm")varGDB*gorm.DBtypeTstruct{ Idint32`json:"id"` Pidint32`json:"pid"gorm:"index"` Namestring......
  • Apple开发_Swift语言地标注释
    1、前言随着编码过程深入,工程代码量会增加,任何在这大量的代码中能快速找到需要方法或者是刚才修改过代码呢?在Swift代码中使用地标注释,然后就可以使用Xcode工具在代码中......
  • 410. 分割数组的最大值
     labuladong题解难度困难723收藏分享切换为英文接收动态反馈给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。设计......
  • c语言<<,>>应用理解
    不讲原理,在使用中总结的规律,在进制转换中遇到10机制的左移或右移,可以将变量乘以2的n次方或者除以2的n次方,左乘,右除,但是乘除要考虑高位的数据溢出,低位数据的丢失。例如十进......
  • c语言测试题
     1、应用缓冲文件系统对文件进行读写操作,关闭文件的函数名为()。 A、fclose0 B、fwrite C、close(0 D、fread(0正确答案:A学生答案:AV2、若有int......
  • 数组
    数组1.定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成2.数组的声明和创建packagecom.ylmxy.array;publicc......
  • C-Primer-Plus-第二章-C语言概述
    第二章C语言概述参考书籍:CPrimerPlus(第6版)中文版一、前言打算跟这本书系统地学习一遍C语言,谨以此系列文章记录自己的学习之路。本文所有图片均来源于此书。二、主......
  • 2022-08-16 第六组 Myy 学习笔记_DQL数据库查询语言
    DQL数据库查询语言重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。构建数据库创建一张student表:DROPTABLEIFEXISTSst......
  • 了解使用Java语言操作数据库的API之JDBC
    一、简单了解JDBC是官方定义的一套使用Java语言操作数据库的API,各数据库厂商按照此标准定义各自的实现类,因此在使用JDBC操作不同的数据库时,需导入对应的驱动jar包。二......