C语言中数组的使用详解

目录
  • 1 数组的基本概念
  • 2 数组定义语法
  • 3 一维数组的初始化
    • 3.1 全部初始化
    • 3.2 部分元素赋初值
    • 3.3 省略长度赋初值
  • 4 一维数组的使用示例
    • 4.1 求最大值、最小值、平均值
    • 4.2 数组逆置
    • 4.3 数组排序
      • 4.3.1 冒泡排序
      • 4.3.2 选择排序 选择列表中的最小值与未排序列表中的第一个值互换位置。
      • 4.3.3 直接插入排序
  • 5 二维数组
    • 5.1 二维数组的概念
    • 5.2 二维数组的初始化
      • 5.2.1 全部初始化 按行全部赋初值
      • 5.2.2 部分初始化
      • 5.2.3 省略长度初始化
  • 6 二维数组示例
    • 6.1 二维数组的遍历
    • 6.2 求平均成绩
  • 7 一维字符数组与字符串
    • 7.1 字符数组
    • 7.2 字符串的保存
    • 7.3 字符串的读取与打印
  • 总结

1 数组的基本概念

  • 数组:类型相同的数据元素的集合,是C语言中的一种构造数据类型。
  • 这些元素会顺序地存储在内存的某段区域。

2 数组定义语法

数组类型 数组名[数组大小]
  • 数组大小:决定了数组中能够存放的元素数量。
  • 数组大小不能是变量,只能是字面值或字面值表达式。
  • C语言编译器要求在编译期间就需要确定数组的内存大小。
  • 数组大小必须是大于0的正整数。

3 一维数组的初始化

3.1 全部初始化

int arr[5] = {1, 2, 3, 4, 5};
//arr[0]:1
//arr[1]:2
//arr[2]:3
//arr[3]:4
//arr[4]:5
  • 初始化列表:用大括号括起来的,用于对数组进行初始化的一个值的列表,每个值之间通过逗号隔开。
  • 初始化列表只能在定义数组时使用,数组定义完成后不能再使用初始化列表给数组赋值。
  • 全部初始化要求初始化列表中各元素个数必须与数组大小相同。

3.2 部分元素赋初值

int arr[5] = {1, 2, 3};
//arr[0]:1
//arr[1]:2
//arr[2]:3
//arr[3]:0
//arr[4]:0

实际开发中,通常采用部分元素赋初值的方法对数组元素进行初始化,如:int arr[100]={0};

3.3 省略长度赋初值

int arr[] = {1, 2, 3, 4, 5};

定义数组时,如果后面跟有初始化列表,并且初始化列表中的值的个数就是预期的数组大小,则可省略括号中的数组大小。

4 一维数组的使用示例

4.1 求最大值、最小值、平均值

#include <stdio.h>
int main(void)
{
    int arr[10];
    int 1, sum, max, min;
    //命令行读取10个整数
    for(i=0; i<10; i++)
    {
        scanf("%d", &arr[i]);
    }
    //求平均值、求最大值、最小值
    sum = 0;
    max = arr[0];
    min = arr[0];
    for(i=0; i<10; i++)
    {
        sum += arr[i];
        if(max < arr[i])
        {
            max = arr[i];
        }
        if(min>arr[i])
        {
            min = arr[i];
        }
    }
    printf("平均值为:%.2f", sum/10.0);
    printf("最大值为:%d", max);
    printf("最小值为:%d", min);
}

4.2 数组逆置

#include<stdio.h>
int main(void){
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i, temp;
    //数组逆置
    for(i=0; i<10/2; i++){
        temp = arr[i];
        arr[i] = arr[10-i-1];
        arr[10-i-1] = temp;
    }
    //输出
    for(i=0; i<10; i++){
        printf("%d\n", arr[i]);
    }
}
 

4.3 数组排序

4.3.1 冒泡排序

  • 两两比较,每一轮都找出一个最大值或最小值。

排序:5, 7, 1, 4, 9, 2, 10, 3, 8, 6

第一次:5,1,4,7,2,9,3,8,6,|10

第二次:1,4,5,2,7,3,8,6,|9,10

第三次:1,4,2,5,3,7,6,|8,9,10

第四次:1,2,4,3,5,6,|7,8,9,10

第五次:1,2,3,4,5,|6,7,8,9,10

第六次:1,2,3,4,|5,6,7,8,9,10

第七次:1,2,3,|4,5,6,7,8,9,10

第八次:1,2,|3,4,5,6,7,8,9,10

第九次:1,|2,3,4,5,6,7,8,9,10

#include<stdio.h>
int main(void){
    int arr[10] = {5, 7, 1, 4, 9, 2, 10, 3, 8, 6};
    int i, j, temp;
    //冒泡排序
    for(i=0; i<10-1; i++){
        for(j=0; j<10-i-1; j++){
            if(arr[j]>arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    //输出
    for(i=0; i<10; i++){
        printf("%d\n", arr[i]);
    }
}
 

4.3.2 选择排序 选择列表中的最小值与未排序列表中的第一个值互换位置。

排序:5, 7, 1, 4, 9, 2, 10, 3, 8, 6

第一次:1,|7,5,4,9,2,10,3,8,6

第二次:1,2,|5,4,9,7,10,3,8,6

第三次:1,2,3,|4,9,7,10,5,8,6

第四次:1,2,3,4,|9,7,10,5,8,6

第五次:1,2,3,4,5,|7,10,9,8,6

第六次:1,2,3,4,5,6,|10,9,8,7

第七次:1,2,3,4,5,6,7,|9,8,10

第八次:1,2,3,4,5,6,7,8,|9,10

第九次:1,2,3,4,5,6,7,8,9,|10

#include<stdio.h>
int main(void){
    int arr[10] = {5, 7, 1, 4, 9, 2, 10, 3, 8, 6};
    int i, j, min, temp;
    //选择排序
    for(i=0; i<10-1; i++){
        min = i;
        for(j=i+1; j<10;j++){
            if(arr[min]>arr[j]){
                min = j;
            }
        }
        if(min != j){
            temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
    //输出
    for(i=0; i<10; i++){
        printf("%d\n", arr[i]);
    }
}
 

4.3.3 直接插入排序

每次都无序列表中选择第一个元素,与有序列表中最后一个元素开始逐一比较,在比它小的元素后面插入该元素。

排序:5, 7, 1, 4, 9, 2, 10, 3, 8, 6

第一次:5,7,|1, 4, 9, 2, 10, 3, 8, 6

第二次:1,5,7,|4, 9, 2, 10, 3, 8, 6

第三次:1,4,5,7,|9, 2, 10, 3, 8, 6

第四次:1,4,5,7,9,|2, 10, 3, 8, 6

第五次:1,2,4,5,7,9,|10, 3, 8, 6

第六次:1,2,4,5,7,9,10,|3, 8, 6

第七次:1,2,3,4,5,7,9,10, | 8, 6

第八次:1,2,3,4,5,7,8,9,10, |6

第九次:1,2,3,4,5,6,7,8,9,10

#include<stdio.h>
int main(void){
    int arr[10] = {5, 7, 1, 4, 9, 2, 10, 3, 8, 6};
    int i, j, temp;
    //直接插入排序
    for(i=1; i<10; i++){
        temp = arr[i];//保存无序列表中的第一个元素
        for(j=i-1; j>=0 && arr[j]>temp; --j){
            arr[j+1] = arr[j];//比该元素大的元素均往后移一位
        }
        arr[j+1] = temp;
    }
    //输出
    for(i=0; i<10; i++){
        printf("%d\n", arr[i]);
    }
}
 

5 二维数组

5.1 二维数组的概念

二维数组就是存放一维数组的一维数组。本质上可以理解为二维数组就是一个一维数组,只不过这个一维数组里面的每一个元素都是一个一维数组。

int arr[3][4];//相当于定义一个3行4列的二维数组

相当于一个长度为3的一维数组,这个一维数组里面每个元素的长度是:长度为4的整形一维数组。

5.2 二维数组的初始化

5.2.1 全部初始化 按行全部赋初值

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};

顺序全部赋初值

int arr[2][3] = {1, 2, 3, 4, 5 ,6};

5.2.2 部分初始化

按行部分赋初值

int arr[2][3] = {{1, 2}, {4}};

顺序部分赋初值

int arr[3][4] = {1, 2, 3, 4};

5.2.3 省略长度初始化

可省略行数,不可省略列数。按行

int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};//arr[3][3]
int brr[][3] = {{1, 2}, {3, 4}};//brr[2][3]

按顺序

int arr[][3] = {1, 2, 3 ,4, 5};//arr[2][3]

6 二维数组示例

6.1 二维数组的遍历

#include<stdio.h>
int main(void){
   int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
   int i, j;
   for(i=0; i<3; i++){
       for(j=0; j<4; j++){
            printf("%d ", arr[i][j]);
       }
       printf("\n");
   }
}
 

6.2 求平均成绩

#include<stdio.h>
int main(void){
   /*
               张三    李四   王五   赵六
       高数      64     55    12     78
       英语      75     90    14     68
       C语言     89     85    99     84
       求每个人的平均成绩和每门课的平均成绩
    */
    int arr[3][4], i, j, sum;
    double aver1[3], aver2[4];
    for(i=0; i<3; i++){
        switch(i){
        case 0:
            printf("高数成绩:\n");
            break;
        case 1:
            printf("英语成绩:\n");
            break;
        case 2:
            printf("C语言成绩:\n");
            break;
        }
        for(j=0; j<4; j++){
            scanf("%d", &arr[i][j]);
        }
    }
    //求每一科的平均成绩
    for(i=0; i<3; i++){
        sum = 0;
        for(j=0; j<4; j++){
            sum+=arr[i][j];
        }
        aver1[i] = sum/4.0;
    }
    //求每个人的平均成绩
    for(i=0; i<4; i++){
        sum = 0;
        for(j=0; j<3; j++){
            sum+=arr[j][i];
        }
        aver2[i] = sum/3.0;
    }
    for (i=0; i<3; i++) {
        switch (i) {
        case 0: printf("高数"); break;
        case 1: printf("英语"); break;
        case 2: printf("C语言"); break;
        }
        printf("的平均成绩为:%.2f\n", aver1[i]);
    }
    printf("------------------------\n");
    for (i=0; i<4; i++) {
        switch (i) {
        case 0: printf("张三"); break;
        case 1: printf("李四"); break;
        case 2: printf("王五"); break;
        case 3: printf("赵六"); break;
        }
        printf("的平均成绩为:%.2f\n", aver2[i]);
    }
    return 0;
}
 

7 一维字符数组与字符串

7.1 字符数组

char ch[5] = {'a', 'b', 'c', 'd', 'e'};

7.2 字符串的保存

  • C语言中没有专门存放字符串的类型,如果期望对字符串进行保存,只能通过字符数组来保存。
  • C语言中允许通过字符串字面值初始化字符数组。
  • 字符串可理解为是一种特殊的字符数组,如果字符数组中存在'\0',那么它就可以当成是一个字符串,如果没有'\0',则是普通的字符数组。
  • '\0'的ASCII码是0
char s1[6] = {'a', 'b', 'c', 'd', 'e', '\0'};
char s2[6] = "abcde";
//s1与s2初始化效果相同

7.3 字符串的读取与打印

char str[100];
//输入 ni hao a
scanf("%s", str);
//打印 ni
printf("%s\n", str);
  • 注意:scanf读取字符串使用%s,另外数组名前面不需要加&。
  • 字符串在打印时,实际上是打印第一个'\0'之前的所有字符。
  • scanf在读取字符串时,遇到空格会认为字符串输入截止,不会读取空格及空格之后的内容。
  • scanf不会读取空格。
  • 如果想要完整读取一行内容(包括空格),可使用gets()。
char str[100];
gets(str);
puts(str);
  • puts()在完成字符串打印之后,自动打印一个换行。
  • 如果预期读取的字符串包含空格,使用gets()。
  • 如果只是原原本本地输出某个字符串,使用puts()。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言变长数组使用详解

    看如下代码: #include<stdio.h> typedef struct { int len; int array[]; }SoftArray; int main() { int len = 10; printf("The struct's size is %d\n",sizeof(SoftArray)); return 0; } 运行结果: [root@VM-0-7-centos mydoc]# ./a.out The struct's size is 4 我们可以

  • C语言中0数组\柔性数组的使用详解

    前言: 上次看到一篇面试分享,里面有个朋友说,面试官问了char[0] 相关问题,但是自己没有遇到过,就绕过了这个问题. 我自己在这篇文章下面做了一些回复. 现在我想结合我自己的理解,解释一下这个 char[0] C语言柔性数组的问题. 0数组和柔性数组的介绍 0数组顾名思义,就是数组长度定义为0,我们一般知道数组长度定义至少为1才会给它分配实际的空间,而定义了0的数组是没有任何空间,但是如果像上面的结构体一样在最后一个成员定义为零数组,虽然零数组没有分配的空间,但是它可以当作一个偏移量,因为数

  • 详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 全局变量 内存映射 可以对内存的内容修改修改硬盘的内容 一般在数据库中经常使用 内存的分配与释放 c语言分配内存的方法 // malloc(需要分配的大小): 这里的分配的大小需要对齐的2的指数 void *mem = malloc(size); 释放内存 // 一般分配的内容都是在堆空间中的 //

  • C语言strlen和sizeof在数组中的使用详解

    目录 一.前言 二.sizeof在二维数组的试题 解读: 题解: 答案验证: 64位平台下: 32位平台下: 一.前言 前面我们详细讲了sizeof和strlen中的使用,基本涉及了所有一维数组可以和常见的题目类型 那么现在我们就将一维数组告一段落了,现在我们来开始讲解在二维数组的使用了,本篇是 sizeof和strlen的最后一篇了. 二.sizeof在二维数组的试题 #include<stdio.h> int main() { int a[3][4] = { 0 }; printf(&qu

  • 使用Python向C语言的链接库传递数组、结构体、指针类型的数据

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来调用C语言的代码库. 至于如何调用基础数据类型的数据,请大家参考我的另外一篇文章:Python使用ctypes调用C/C++的方法 1. 使用python给C语言函数传递数组类型的参数 想必很多时候,C语言会使用数组作为参数,在之前我们使用过ctypes的一些数据类型作为C语言参数类型,包括byte

  • C语言结构体数组的定义和使用详解

    目录 介绍 结构体数组定义时初始化 补充 介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这时就要使用数组.结构体中也有数组,称为结构体数组.它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项. 定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组.或者说同前面介绍的普通数组

  • C语言中数组的使用详解

    目录 1 数组的基本概念 2 数组定义语法 3 一维数组的初始化 3.1 全部初始化 3.2 部分元素赋初值 3.3 省略长度赋初值 4 一维数组的使用示例 4.1 求最大值.最小值.平均值 4.2 数组逆置 4.3 数组排序 4.3.1 冒泡排序 4.3.2 选择排序 选择列表中的最小值与未排序列表中的第一个值互换位置. 4.3.3 直接插入排序 5 二维数组 5.1 二维数组的概念 5.2 二维数组的初始化 5.2.1 全部初始化 按行全部赋初值 5.2.2 部分初始化 5.2.3 省略长度

  • C语言 array数组的用法详解

    目录 一维数组的创建与初始化 程序一: 程序二: 程序三 程序四(二维数组 - 二维数组 的 列 绝对不能 省略 ) 二维数组在内存中的存储 程序一 数组作为函数参数,怎么作? 实例:冒泡排序 数组名: 一维数组的创建与初始化 数组是一种相同类型元素的集合 程序一: #include<stdio.h> #include<string.h> int main() { 创建一个数组 int arr1[10];// [常量] 初始化 int arr[10]={1,2,3};不完全初始化,

  • C语言 柔性数组的使用详解

    目录 一.柔性数组的特点 二.柔性数组的使用 1.如何使用柔性数组 2.不用柔性数组的话有什么代替 三.柔性数组的优势 1.方便内存释放 2.提高访问速度 一.柔性数组的特点 struct S { int x; int a[]; }; int main() { printf("%d", sizeof(S)); } 这段代码的输出是什么? 我们打印结构体S所占空间的大小,这个a[]占多少字节呢? 输出结果是4,可一个int类型的x就是4了,a[]去哪了?好奇怪哦. 原来,这是一种柔性数组

  • C语言中的文件操作详解

    目录 1.为什么使用文件 2.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3.文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6.文本文件和二进制文件 7.文件读取结束的判定 7.1被错误使用的feof 8.文件缓冲区 结论 1.为什么使用文件 在学习结构体时,写了一个简易的通讯录的程序,当程序运行起来的时候,可以在通讯录中增加和删除数据,此时数据是存放在内存当中的,当程序退出

  • 易语言中数据库“更新索引”命令详解

    通过完全重建来更新当前数据库的当前索引. 成功返回真,失败返回假. 语法: 逻辑型 更新索引 () 例程: 说明: 打开数据库的同时,打开2个索引文件."更新索引"按钮被单击后,运行"更新索引()"命令,成功更新索引后,将当前打开的索引显示在列表框中. 以上就是易语言中数据库"更新索引"命令详解的详细内容,更多关于易语言更新索引命令的资料请关注我们其它相关文章!

  • 从go语言中找&和*区别详解

    *和&的区别 :& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 . 从代码中验证 : 先构建一个Rect类型 : 1. &是取地址符号, 取到Rect类型对象的地址 2. *可以表示一个变量是指针类型(r是一个指针变量): 3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值 4.查看这个指针变量的地址 , 基本数据类型直

  • C语言中 & 和 &&的区别详解

    这是c语言的基本语法,但是在学习的过程中也总是搞混.所以记录一下,也和大家分享一下. &:按照位与操作,例如:0010&1101,结果为0000 &是java中的位逻辑运算:       eg: 2&3=2: 分析如下: 2的二进制为10 :3的二进制为11 : 逻辑&之后为10 &&:短路与,表示如果两个条件都成立则执行之后的逻辑: 例如:if(a==0&&b==0),意思就是if a为0并且b为0的时候,进行下一步操作. || 短

  • R语言中因子相关知识点详解

    因子是用于对数据进行分类并将其存储为级别的数据对象. 它们可以存储字符串和整数. 它们在具有有限数量的唯一值的列中很有用. 像"男性","女性"和True,False等.它们在统计建模的数据分析中很有用. 使用factor()函数通过将向量作为输入创建因子. 例 # Create a vector as input. data <- c("East","West","East","North

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

  • Go语言中基本数据类型的相互转换详解

    目录 基本数据类型的相互转换 基本语法 小知识 基本数据类型和string的转换 方法一 方法二 string和基本数据类型转换 基本数据类型的相互转换 Go在不同类型的变量之间赋值时需要显示转换,不能自动转换 基本语法 表达式 T(v): 将值v转换成类型T T就是数据类型: int32, int64, float32... v就是需要转换的变量 1.不考虑溢出的情况下,类型转换不会改变数值大小 var i int8 = 100 var n int32 = int32(i) fmt.Print

随机推荐