C语言数组

知识点


主要包含的知识点为一维数组/二维数组的基本知识,字符串数组的常用函数。通过程序来说明这些知识点的用法。

  • 数组的定义、初始化、数组元素的引用
  • 数组在内存中的存储
  • 字符数组以及字符串常用函数

一维/二维数组基本知识


一维数组

通过对一个实例程序来说明数组的有关基本知识。
这里拿“冒泡法”算法作为示例:

pop算法程序代码:

#include<stdio.h>

int main(){
    //定义n 作为数组的大小 
    int n;
    //while语句内表示scanf可以一直输入
    //知道遇到读取的结束符EOF (console控制台可以输入ctl+z跳出循环) 
    //也可以协作为 while(scanf("%d",&n) != EOF){}
    printf("Please input a number as the size of the length of array:\n");
    while(scanf("%d",&n) == 1){
        //一维数组的定义:标准格式 
        //类型名 数组名 [常量表达式]
        //这里需要注意的一点是 [n] 中的n一定是一个常量!!!
        //另外定义一个t用作交换数值的temp 
        printf("\nPlease input the data of the array:\n");
        int a[n],t;
        //一维数组的初始化
        //1.指定n 对其中l(l<=n)个元素赋值 从0-(l-1)赋值 未被赋值的元素默设置为 0 
        //示例:int a[5] = {0,1,2} 其中a[3] a[4]的值均为0 其他为赋值的数值 
        //2.n未指定 赋值n个元素 则该数组的长度被设置为 n
        //(计算机为其开辟 n个int类型或者其他类型的内存空间 来存储这些数据)
        //int a[] = {0,1,13} 
        for(int i=0;i<n;i++)
            //这里通过scanf读入需要初始化的数组内的数组元素数据 
            scanf("%d",&a[i]);
        //使用for循环 输出排序之前的数组元素顺序
        printf("\nThe sequence before sort:\n");    
        for(int i=0;i<n;i++)
            printf("%d    ",a[i]);
        printf("\n");   
        //冒泡算法 pop算法  
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-i-1;j++){
                if(a[j]>a[j+1]){
                    t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }
        //使用for循环 输出排序后的数组元素顺序
        printf("\nThe sequence after sort:\n"); 
        for(int i=0;i<n;i++)
            printf("%d    ",a[i]);
    //提示用户输入数组的大小 n     
    printf("\n\nPlease input a number as the size of the length of array:\n");
    }
    //函数正常返回 0 
    return 0;
}

程序运行结果:
冒泡程序运行结果

示例程序中便是一维数组的基本知识点,有关排序以及其他的算法,后续有时间的话会专门在算法的博客栏目部分做进行相关的总结。
这里有一个关于pop(冒泡)算法的讲解,不懂的同学可以参考学习一下。

二维数组


通过对一个实例程序来说明数组的有关基本知识。
这里拿“矩阵的转置”作为示例:

矩阵转置代码:

#include<stdio.h>

int main(){
    //定义be af数组分别存放转置前后的数组元素 
    //定义同一维数组定义一样 行列长度 m,n 均为常量表达式 
    //初始化二维数组
    //1.可以初始化二维数组 数组内部的元素 如:前面的1,2,3 
    //2.可以按行初始化 如:{4,5,6}
    //3.初始化的时候可以部分初始化 如:{7,8} 缺省的部分默认设置为 0
    int be[3][3] = {1,2,3,{4,5,6},{7,8}},af[3][3];
    //也可以采用读入数据的方式初始化be 数组
    /* 
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            scanf("%d",&be[i][j]);
    */
    //打印转置之前的二维数组 
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            printf("%d    ",be[i][j]);
        printf("\n");
    }
    //将数组进行转置 (矩阵)
    //行列互换 即:af[j][i] = be[i][j];
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            af[j][i] = be[i][j];
    printf("\n");
    //打印转置之后的二维数组 
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            printf("%d    ",af[i][j]);
        printf("\n");
    }
    //函数正常返回 0 
    return  0;
} 

程序运行结果:
转置矩阵结果

数组在内存中存储


无论事一维数组还是二维数组,在计算机为其开辟的存储空间均是连续的,根据内存的存储方式划分,这种方式称为线性表的顺序存储。

图示为线性表的顺序存储结构示意图:

结构图示

若为二维数组,数组的存储会按行进行顺序存储,即:a[2][2]存储顺序为:a[0][0],a[0][1],a[1][0],a[1][1]
重要的是内存地址的理解,也是C的核心,会在后面指针的部分进行总结。

字符数组&字符串常用函数


C语言中没有字符串类型,字符串是作为字符数组进行处理的,标准的scanf和printf中以“%s”进行输入和输出的,规定‘\0’作为字符串的结尾标志符。
字符数组和一般的其他数据类型的数组操作类似

这里拿一个程序示例字符数组和字符串的用法:

程序代码:

#include<stdio.h>
#include<string.h>

int main(){
    //定义三个字符数组 a b c  
    //对前两个数组进行初始化  
    //初始化长度不够的字符 会自动赋值给空操作符 
    char a[10] = {'H','e','l','l','o'};
    char b[10] = {'w','o','r','l','d','!'};
    char c[10];
    //定义str字符串 定义l为其实际长度 
    char str[30],l=0;
    //定义str0 str1 str2字符串 
    char str0[100],str1[20],str2[20];

    printf("Please input an array C[10]:\n");
    for(int i=0;i<10;i++)
        scanf("%c",&c[i]);

    //字符串在C中实际上也是字符数组
    //可以按照字符数组引用的方式给其中的元素进行赋值   
    for(int i=0;a[i];i++)
        str[l++] = a[i];
    for(int i=0;b[i];i++)
        str[l++] = b[i];
    for(int i=0;c[i];i++)
        str[l++] = c[i];

    //输出合并 a b c 字符数组后的str字符串
    printf("str combine a b c:\n%s\n",str); 

    //字符串长度函数 测试l 与strl长度是否一致 
    int strl = strlen(str);
    printf("l:%d\tstrl:%d\n",l,strl);

    printf("\n\nPlease input str1:\n");
    scanf("%s",str1);

    //gets函数可以读入带有空格的字符串 以回车作为结束符 
    //在gets()前输入的回车都能够被gets()函数捕获到 gets输入的内容便为空
    //这里提供两种思路解决gets()不捕获前面回车符的问题
    //1.scanf中格式控制"%s "的空格可以吸收所有连续的空白(空格,回车,tab)
    //2.rewind(stdin)清空输入缓冲区
    //scanf("%s ",str1);
    //rewind(stdin);
    printf("Please input str2:\n"); 
    rewind(stdin);
    //gets()输入字符串函数 遇到回车符结束输入 
    gets(str2);
    //puts()输出字符串函数 默认带有换行
    printf("Onput str2:\n");
    puts(str2);
    printf("\n") ;

    //字符串copy函数 str2内容copy到str0中  str0内容被覆盖 
    strcpy(str0,str2);
    printf("str0-copy str2:%s\n\n",str0);   

    //字符串连接函数 str0拼接str1 结果存放到str0中
    //实际上合并后的字符数组的地址是str0的地址 
    strcat(str0,str1);
    printf("str0-combine str1:%s\n\n",str0);


    //字符串的比较函数 字符串中的字符逐个字符进行按照ASCII码值进行比较 
    //比较的结束条件是 遇到不相同的字符或者字符串的结束标志符 '\0' 
    // str0等于str2 返回0
    //  str0大于str2 返回一个正整数 
    // str0小于str2 返回一个负整数 
    printf("compare the content between str0 and str1:%d\n\n",strcmp(str0,str2));

    //字符串长度函数 函数返回的值为一个整数值 
    printf("The length of str0:%d\n\n",strlen(str0));

    //字符串大写函数 strupr() 
    printf("The upper of the string:\n");
    puts(strupr(str0));
    //字符串小写函数 strlwr()
    printf("The lower of the string:\n");
    puts(strlwr(str0));



    return 0;
} 

程序运行截图:
程序运行截图

结语


数组的内容总结到这里差不多结束了。夜深人静,外面好冷,该回家睡觉了~~
文章内容,博主手写,可能会有错误或瑕疵的部分,如有问题请积极留言,方便讨论交流学习。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值