C语言 | chap5数组

一、一维数组

1.1基本概念

  • 数组:元素类型相同的数据集合

  • 一般形式:

    数据类型 数组名称 [ 数据长度 ];

    • 数组长度必须是大于0的整型字面值(不可以是小数,不可以是变量)
    • 数组名必须是满足C语言要求的合法标识符(由数字,字母,下划线组成,数字不可以打头,不可以是关键字)
    • 数组的元素类型可以是基本类型(char、int、double…),也可以是构造数据类型(数组、结构体、枚举体、联合体)
  • 数组中的元素在内存中是连续存储的

  • int a[10]://表示定义了一个长度为10,元素类型为int,名称为a的数组。

  • int a[10]://相当于同时定义了10个int类型变量

1.2数组的使用(数组元素的访问)

  • 访问数组中的元素通过 [ ](下标)来访问

  • 一个长度为n的数组,下标的合法访问范围为 0~n-1

  • [ ] 在数组定义语句当中,表示数组长度

  • [ ] 在访问数组语句当中,表示元素下标

  • 当下标的值超过数组合法下标范围时,这种情况称为下标访问越界

    • 代码

      int arr[5];
      
      printf("%d\n", sizeof(arr)); // 20
      
      printf("%d\n", sizeof(arr[0])); // 4
      
      printf("%d\n", sizeof(arr)/sizeof(arr[0]));// 5
      

1.3数组的初始化

  • 初始化:变量在分配内存的同时指定初始值

  • 数组的初始化就是给数组分配内存的同时指定数组每个元素的值

  • 数组的初始化时通过初始化列表完成的

    • 代码:int arr[5] = {1,2,,3,4,5};
  • 如果数组没有进行初始化,数组元素的值是随机值

1.3.1全部初始化

  • 数组长度和初始化列表元素个数相同
  • int arr[5] = {1,2,3,4,5}

1.3.2部分初始化

  • 初始化列表元素个数小于数组长度
  • 代码:int arr[5] = {1,2,3};
  • 代码:arr[0]=1 arr[1]=2 arr[2]=3 arr[3]=0 arr[4]=0;
  • 首先按照初始化列表元素顺序依次赋值给数组每个元素,没有赋值的元素默认初始化为0
  • 代码:int arr[1000] = {0}; // 数组所有元素初始化为0

1.3.3省略长度初始化

  • 在定义数组的时候如果使用初始化列表进行初始化,而初始化列表元素个数与数组长度刚好相同时,此时可以省略数组长度
  • int arr[5] = {1,2,3,4,5};
  • 等同于 int arr [] = {1,2,3,4,5};

二、字符数组与字符串

2.1基本概念

  • 字符数组:元素类型为char的一维数组

    • char arr[10];
  • C语言中并没有string类型,通过字符数组来实现字符串的存储与操作。

    • char str[] = “abcd”; // {‘a’, ‘b’, ‘c’, ‘d’, ‘\0’}

      • 里面是字符串字面值,但是有五个字符 // {‘a’,‘b’,‘c’,‘d’,’\0’,0,0,0}后面的0是机器初始化的,前面的\0是转义字符
    • str数组的长度(相当于字符个数)是5,字符长度是4(第一个\0前面的字符数)

    • C语言允许使用字符串字面值来初始化字符数组

  • 给定一个字符数组,怎么判断其存储的是否是字符串

    • 只需要判断其中是否有’\0’

    • char str[] = “”; //是字符串,因为有\0,从字符数组角度来看,str长度是1;从字符串角度来看,str字符串长度是0

      • 代码:

        char str1[5] = {'a','b','c','d','e'};
        
        char str2[5] = {'a','b','c','d'};
        
        char str3[] = "abcd";
        
        char str4[5] = "abcde";
        
        
      • str1不是字符串,没有’\0’

      • str2是字符串

      • str3是字符串

      • str4数组访问越界

    • 字符个数:所有字符的个数

    • 字符串长度:第一个’\0’之前字符个数

2.2字符串的输入输出

  • scanf()/printf():通过 %s来进行字符串的输入和输出

    • scanf在读取字符串可以不用加取地址符(&)(只针对’%s’),因为str代表字符串数组的时候已经把地址传过去了
    • scanf 遇到空格和换行表示读取结束,刚开始读取遇到空格和换行(遇到前导空格和换行)会跳过,从非空格和换行的字符开始读取
    • scanf()在读取字符串时,不会读取空格和换行,剩余空格或换行如果对之后读取产生垃圾数据时,可以收到读取垃圾数据(getchar()),也可以清空输入缓存区(fflush(stdin))
  • 代码

    char str[100]
    
    char c;
    
    scanf("%s",str);
    
    scanf("%c",&c);
    
    printf("%s\n",str);
    
    printf("---%c---\n",c);
    
    • 修正

      • 修正一:

        char str[100]
        char c;
        scanf("%s",str);
        scanf("%c",&c);//getchar() 读取无效
        scanf("%c",&c);
        printf("%s\n",str);
        printf("---%c---\n",c);
        
      • 修正2:

        char str[100]
        char c;
        scanf("%s",str);
        fflush(stdin);//清空输入缓存
        scanf("%c",&c);
        printf("%s\n",str);
        printf("---%c---\n",c);
        
  • gets()和puts()

    • gets()直接读取一整行数据作为字符串,包括空格
    • puts()打印字符串,并在末尾添加一个换行’\n’
    • 例子:puts(""); //表示换行

2.3 C语言中字符串处理函数

  • C语言提供了一系列关于字符串的方法,在<string.h>

  • strlen():获取字符串长度

    • 例子:

      char str[] = "nihao";
      
      printf("%d\n", strlen(str));
      
      printf("%d\n", strlen("hahaha"));
      
  • strcpy():字符串拷贝(字符串赋值

    • 例子:

      char str1[100] = "hello";
      
      char str2[100] = "nihao";
      
      char temp[100];
      
      strcpy(temp, str1);
      
      strcpy(str1, str2);
      
      strcpy(str2, temp);
      
      puts(str1);
      
      puts(str2);
      
      • // 第一个参数必须保证是字符数组,并且字符数组长度足够长(比第二个参数的字符串长度+1长)
  • strcmp():字符串比较

    • 0:相等

    • 1:第一个参数大

    • -1:第二个参数大

    • 例子:

      char str1[100] = "hello";
      
      char str2[100] = "nihao";
      
      printf("%d\n", strcmp(str1, str2)); // -1
      
      printf("%d\n", strcmp(str1, str1)); // 0
      
      printf("%d\n", strcmp(str2, str1)); // 1
      
  • strcat():字符串拼接

    • 例子:

      char str1[100] = "hello";
      
      char str2[100] = "nihao";
      
      strcat(str1, str2);
      
      puts(str1); // hellonihao
      

三、二维数组

3.1基本概念

  • 二维数组:存放一维数组的一维数组

  • 一般形式:类型 数组名 [行数][列数];

    • int arr[3][4];

    • 3行4列的二维数组。

    • 长度为3的一维数组,里面每一个元素是长度为4的整型一维数组。

      /*
      arr[0][0] arr[0][1] arr[0][2] arr[0][3]
      arr[1][0] arr[1][1] arr[1][2] arr[1][3]
      arr[2][0] arr[2][1] arr[2][2] arr[2][3]
      11 12 13 14
      21 22 23 24
      31 32 33 34
      */
      int arr[3][4];
      int i, j;
      for (i=0; i<3; ++i) {
      	for (j=0; j<4; ++j) {
      		arr[i][j] = (i+1)*10 + (j+1);
      	}	
      }
      		
      for (i=0; i<3; ++i) {
      	for (j=0; j<4; ++j) {
      		printf("%d ", arr[i][j]);
      	}
      	puts("");
      }
      

3.2二维数组的初始化

3.2.1按行初始化

  • 例子:1、嵌套式初始化列表

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

3.2.2整体初始化

  • 例子:1、会逐行放入,剩下有多余的位置会初始化成0

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

3.2.3特殊初始化(省略长度初始化)

  • 二维数组在定义时,如果指定初始化列表,则可以省略行数,但不可以省略列数

  • 换一种思路理解,相当于省略二维数组的个数,但是二维数组中的一维数组的个数不可以省略

    int arr[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    
    int arr[][4] = {1,2,3,4,5,6,7};
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑眼圈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值