C语言数组知识的个人笔记

本文详细介绍了C语言中数组的定义、引用、初始化以及一维、二维数组和字符数组的操作。讲解了如何定义一维和二维数组,引用数组元素,以及如何初始化数组。同时,还探讨了字符数组的特性,包括字符串的处理,如输入输出、字符串连接、复制和比较等。此外,还提到了常用的字符串处理函数,如puts、gets、strcpy、strcat、strcmp等。

利用数组处理批量数据

  • 数组是一组有序数据的集合,每一个元素都属于同一个数据类型

怎样定义一维数组

  • 一维数组的一般形式为

    类型说明符 数组名[常量表达式]

  • 数组名的命名规则和变量名相同,遵循标识符命名规则

  • 在定义数组时需要指定数组中元素的个数,方括号中的常量表达式就是用来表达元素的个数的,即数组长度

  • 常量表达式中可以包括常量和符号变量,不能包含变量,C语言不允许对数组的大小做动态定义

怎样引用一维数组元素

  • 引用数组元素的表示形式为

    数组名[下标]

  • 注意:定义数组时和引用数组时形式相同但是含义同

  • 注意:**数组下标从 0开始,如果用int[10]定义一个数组,则最大下标值为9,不存在数组元素a[10]

  • eg

    #include<stdio.h>
    int main()
    {
        int i,a[10];
        for(i=0;i<=9;i++)
            a[i]=i;
        for(i=9;i>=0;i--)
            printf("%d",a[i]);
        printf("\n");
        return 0;
    }

一维数组的初始化

  • 为使程序简洁,常在定义数组的同时给各数组元素赋值,这叫做数组的初始化

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

    各数组元素顺序放在一对花括号内,数据间用逗号分开

  • 也可以只给一部分元素赋值

    int a[10]={0,1,2,3,4,};

    a数组中有十个元素,但是花括号内只提供5个初值,即给前五个赋初值,后5个元素赋初值为0

  • 若数组元素初值全为0

    int a[10]={0}

  • 利用数组排序问题(冒泡法)

    #include<stdio.h>
    int main()
    {
        int a[10];
        int i, j, t;
        printf("input 10 numbers:\n");
        for (i = 0; i < 10; i++)
            scanf("%d", &a[i]);
        printf("\n");
        for(j=0;j<9;j++)//进行9次循环,实现9趟比较
            for(i=0;i<9-j;i++)//在每一趟中进行9-j次比较
                if (a[i] > a[i + 1])//相邻两个数比较
                {
                    t = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = t;
                }
        printf("the sorted numbers:\n");
        for (i = 0; i < 10; i++)
            printf("%d", a[i]);
        printf("\n");
        return 0;
    }

怎么定义二维数组

  • 二维数组定义的一般形式为:

    类型说明符 数组名[常量表达式] [常量表达式]

  • 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[1][2]=b[2][3]/2;

  • 引用数组元素时,下标值应在已定义的数组大小的范围内

    int a[3][4];
    a[3][4]=3;//这是错的引用,不存在a[3][4]元素

二维数组的初始化

  • int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  • int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
  • int a[3][4]={{1},{5},{9}};//只给各行第一列的元素赋初值,其余元素自动为0(部分元素赋初值)
  • eg

    #include<stdio.h>
    int main()
    {
        int i, j, row = 0, colum = 0, max;
        int a[3][4] = { {1,2,3,4},{9,8,7,6}, {-10,10,-5,2 } };
        max = a[0][0];
        for (i = 0; i <= 2; i++)
            for(j=0;j<=3;j++)
                if (a[i][j] > max)
                {
                    max = a[i][j];
                    row = i;
                    colum = j;
                }
        
        printf("max=%d\nrow=%d\ncolum=%d\n", max, row, colum);
        return 0;
    }

怎么定义字符数组

  • 用来存放字符数据的数组是字符数组,一个元素存放一个字符

    char c[10];
    c[0]='I';c[1]=' ';c[2]='a';c[3]='m';c[4]=' ';c[5]='h';c[6]='a';c[7]='p';c[8]='p';c[9]='y';

  • 由于字符数据是以整形形式存放的(ASCII代码),因此也可以用整形数组来存放字符数据,虽然合法但是会浪费存储空间

字符数组的初始化

  • 最容易理解的方式就是“初始化列表”

    char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};

  • 如果初值个数大于数组长度,会出现语法错误,如果初值个数小于数组长度,其余的元素自动定为空字符

怎么引用字符数组中的元素

#include<stdio.h>
int main()
{
    char c[15]={'I',' ','a','m',' ','h','a','p','p','y'};
    int i;
    for(i=0;i<=15;i++)
        printf("%c",c[i]);
    printf("\n");
    return 0;
}

字符串和字符数组

  • 在c语言中,是将字符串作为字符数组来处理的

  • c系统再用字符数组存储字符串常量时会自动加一个'\0'作为结束符

  • 有了结束标志'\0'之后,字符数组的长度就显得不那么重要了,程序中往往通过检测'\0'的位置老判定字符串是否结束,而不是数组长度

  • '\0'代表ASCII码为0的字符,只起一个供辨别的作用

  • char c[]={"I am happy"};
    //可以省略花括号
    char c[]="I am happy";
    //这里不用单个字符作为字符数组的初值,而是用一个字符串作为初值。注意:数组的长度不是10而是11,因为字符串常量的最后由系统加了一个'\0'。
    //在执行printf函数时,每输出一个字符检查一次,看下一个字符是否为'\0',遇'\0'就停止输出

字符数组的输入输出

  • 逐个字符输入输出,用格式符%c

  • 整个字符串一次输入或输出用%s

  • char c[]={"China"};
    
    printf("%s\n",c);

    在内存中数组c的存储情况为

    China\n

    输出时,遇结束符'\0'就停止输出,输出结果为

    China

  • 用"%s"格式符输出字符串时,printf函数中输出项是字符数组名,而不是数组元素名

    printf("%s",c); ✔

    printf("%s",c[0]); ❌

  • 如果数组长度大于字符串的实际长度,也只输出到遇'\0'结束

  • 可以用scanf函数输入一个字符串

    scanf(“%s”,c);//输入项c是已定义的字符数组名

  • 用一个scanf函数输入多个字符串,则应在输入时以空格分隔

    char str1[5],str2[5],str3[5];
    
    scanf("%s%s%s",str1,str2,str3);

    输入数据:How are you

    str1:How\0\0
    str2:are\0\0
    str3:you\0\0
  • scanf函数中的输入项如果是字符数组名,不要再加地址符&

    scanf("%s",&str); ❌

使用字符串输入函数

  • puts函数---输出字符串的函数

    puts(字符数组)

  • gets函数---输入字符串的函数

    gets(字符数组)

  • 用gets和puts函数只能输出或输入一个字符串,不能写成

    gets(str1,str2)

  • strcat函数---字符串连接函数

    一般形式为:strcat(字符数组1,字符数组2)

    作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面

    char str1[30]={"People's Republic of"};
    char str2[]={"China"};
    printf("%s",strcat(str1,str2));
    //输出结果是
    People's Republic of China 

  • strcpy和strncpy函数---字符串复制函数

    一般形式为:

    strcpy(字符数组1,字符串2)

    作用是将字符串2复制到字符数组1中去

    char str1[10],str2[]="China";
    strcpy(str1,str2);
    //执行后,str1输出为:China
    • “字符数组1”必须写成数组名形式(如str),“字符串2”可以是字符数组名,也可以是一个字符串常量:

      strcpy(str1,"China");
  • 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。字符数组名是一个地址常量,它不能改变值

    str="China";❌
    str1=str2  ;  ❌

  • strcmp函数---字符串比较函数

    一般形式:

    strcmp(字符串1,字符串2)

    strcmp(str1,str2);
    strcmp("China","Korea");
    strcmp(str1,"Beijing");
    • 字符串的比较的规则是:将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止

    • 若str1=str2,则函数值为0

    • 若str1>str2,则函数值大于0

    • 若str1<str2,则函数值小于0

    • if(strcmp(str1,str2)>0)
          printf("Yes");
  • strlwr函数---测字符串长度的函数

    一般形式:

    strlen(字符数组)

    char str[10]=“China”;
        printf("%d",strlen(str));
    //测出结果不是10,而是5,函数的值为字符串中的实际长度(不包括'\0'在内)
  • strlwr函数---转换为小写的函数

    一般形式:

    strlwr(字符串)

  • strupr函数---转换为大写的函数

    一般形式:

    strupr(字符串)

  • 注意:在使用字符串处理函数时,应在程序文件的开头用

    #include<string.h>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值