C语言-一维数组、二维数组 (一篇文章带你彻底读懂!!!)

2023-11-02

数组简介

  1. 数组是相同数据类型的元素的集合

  1. 数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。

  1. 数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。

数组的特性:查询快、增删慢。

为什么查询快?

因为数组存在下标这个概念,可以通过下标对元素进行直接访问,而并不需要像链表一样一步步遍历。

为什么增删慢?

这里举个例子,例如:

arr[10] 这个一维数组中,元素存放已满,现要将arr[5] 这个元素删除掉,那是否就要将 arr[6] - arr[10] 这五个元素全部向前移动来补齐空位呢,所以就总结出来了,数组的元素删除需要移动大量元素;同理插入元素也是一样的道理,所以增删慢。

一维数组的基本操作

数组可以进行插入、删除、查找、遍历、排序等等操作…

一维数组的输入

如下图所示,创建一个 有10个元素的数组arr,又因为它的下标是从0开始,所以最后一位元素位置的下标为9。

void cerate(){

    //定义一个 int类型数组
    int arr[10];
    
    //实现循环录入数组数据
    //这里需要注意 数组的下标以0开始,所以10个元素的数组下标最多到9
    for( int i=0; i<10; i++){
        
        printf("请输入第%d个元素:",i+1);
        scanf("%d",&arr[i]);

    }

}

一维数组的输出

// length 为接收的数组长度
int print(int arr[],int length){

    for(int i=0; i<length; i++){
        
        printf("%d ",arr[i]);
    
    }

}

一维数组的查找

一维数组查找数据是否存在,可以通过遍历数组一步步进行比较,如下文代码所示:

// length 为接收的数组长度
void find(int arr[],int length){

    int value;
    printf("请输入待查找值:");
    scanf("%d",&value);

    //遍历数组
    for(int i=0; i<length; i++){

        //这里进行判断比较
        if(arr[i] == value){

            printf("%d存在数组中,其下标为:%d",value, i);

        }
    
    }

}

一维数组的插入

即元素插入,插入数据需要将插入元素位置及以后的元素向后移动,为待插入数据腾出空间。

// length 为接收的数组长度
void insert(int arr[], int length){

    int index;
    printf("请输入待插入元素的下标:");
    scanf("%d",&index);

    int value;
    printf("请输入待插入元素的值:");
    scanf("%d",&value);

    //将待插入元素位置及以后的元素后移,为其腾空位置
    for(int i=length-1; i>=index ;i++){

        arr[i+1] = arr[i];    //将当前位置元素放到后一位中

    }

    //元素插入 增加数组元素,所以长度相对应也要增加
    length++;

}

一维数组的删除

删除元素与插入相反,需要删除元素以后的元素向前移动,补齐空位。

可以通过删除 指定元素 或 删除指定下标位置 来操作。

// length 为接收的数组长度
void insert(int arr[], int length){

    //通过删除指定下标位置
    int index;
    printf("请输入待删除元素的下标:");
    scanf("%d",&index);

    //通过删除指定元素值
    int value;
    printf("请输入待删除元素的值:");
    scanf("%d",&value);

    //这里就以删除指定下标位置为例,将删除位置以后的元素向前移动,补齐空位。
    //将index+1位的元素 覆盖到 index的位置,index+2 覆盖 index+1 以此类推…
    for(int i=index+1; i<length ;i++){

        arr[i-1] = arr[i];    //将当前位置元素放到前一位中

    }

    //元素删除 减少数组元素,所以长度相对应也要减少
    length--;

}

一维数组的修改

元素修改,与删除一样,我们也是可以通过修改指定下标位置的值,或修改指定值来操作。

上面元素删除拿下标举例子,那元素修改就拿指定值来举例吧。

// length 为接收的数组长度
void amend(int arr[], int length){

    //这里输入待修改的值,即修改前的值
    int value;
    printf("请输入待修改数据的下标:");
    scanf("%d",&value);

    //这里输入修改后的值
    int value_02;
    printf("请输入修改后的值:");
    scanf("%d",&value_02);

    for(int i=0; i<length; i++){
        
        if(arr[i] == value){

            //因为已经满足判断条件 arr[i] == value ,所以以下两行代码等价,选择其一即可
            value = value_02;
            arr[i] = value_02;
            
        }
        
    }
    
}

一维数组的排序

这里因为涉及到了排序算法,大家简单了解即可,以后我会针对排序算法专门出一篇文章进行讲解。

这里采用 冒泡排序 对数组arr进行排序,这里针对下文代码为大家简单讲解冒泡排序的思想。

冒泡排序的思想:相邻两数两两进行比较,将 较大 值移动至后方。

// length 为接收数组的长度
void bubbleSort(int arr[], int length){

    //这里 i<length-1 是为了能够减少循环次数,因为提取1个数据与其余剩下9个数据做对比,如果还比较10次话 会浪费时间,无形中增加了时间复杂度。
    for(int i=0;i< length-1; i++){

        //这里 j<length-i-1 用来控制比较值的个数,即比较次数
        for(int j=0; j<length-i-1 ;j++){

            //判断前值是否大于后值,若大于则进行交换
            if(arr[j] > arr[j+1]){

                //空杯交换,即:创建一个新的变量接收arr[j]的值。否则直接将arr[j+1]的值直接赋给arr[j]后,那么arr[j]的值被覆盖则无法将原值重新赋给arr[j+1]
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = arr[j];

            }

        }

    }

}


二维数组的基本操作

二维数组的初始化

这里 为了能够让大家清晰明了的了解二位数组的存储模式,先以初始化的方式来为其赋值。

void create(){
    
    int arr[3][2] = {    // 意为 3行2列
                        {1,2},
                        {3,4},
                        {5,6}
    };
    
}

二维数组的输入

void create(){
    
    int arr[3][2];

    //定义行下标 循环行
    for(int i=0; i<3; i++){

        //定义列下标 循环列
        for(int j=0; j<2; j++){
            
            printf("请输入第%d行第%d列的元素:",i+1, j+1);
            scanf("%d",&arr[i][j]);
            
        }    //执行完毕内层循环后 表明已经输入完当前列的数据,紧接着外层的第二次循环开始对第二行元素的输入
    
    }
    
}

二维数组的输出

// length 为接收的数组行    length_02 为接收的数组列
int print(int arr[],int length, int length_02){

    for(int i=0; i<length; i++){
        
        for(int j=0; j<length_02; j++){

            printf("%d ",arr[i][j]);

        }
    
        //这里需要注意,如果执行完毕内层循环 则表明已经输出完当前行所有列的值,则需要换行
        printf("\n");
    
    }

}

二维数组的查找

二维数组与一维数组相似,一样可以通过遍历判断来查找。

// length 为接收的数组行    length_02 为接收的数组列
void find(int arr[],int length){

    int value;
    printf("请输入待查找值:");
    scanf("%d",&value);

    //遍历数组
    for(int i=0; i<length; i++){

        for(int j=0; j<length_02 ;j++){

            //这里进行判断比较
            if(arr[i] == value){

                printf("%d存在数组中,它在第%d行第%d列",value, i+1, j+1);

            }

        }
    
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言-一维数组、二维数组 (一篇文章带你彻底读懂!!!) 的相关文章

  • 【邻接表】69 邻接表:构造有权图

    问题描述 目的 使用C 模板设计并逐步完善图的邻接表抽象数据类型 ADT 内容 1 请参照图的邻接矩阵模板类原型 设计并逐步完善图的邻接表ADT 由于该环境目前仅支持单文件的编译 故将所有内容都集中在一个源文件内 在实际的设计中 推荐将抽象
  • JVM 虚拟机

    JDK1 2 Exact VM虚拟机优化 能够准确的判断内存中数时执行内存引用还是整数值 从而减少了句柄的中间开销 提高了熟读 Exact VM因它使用准确式内存管理 Exact Memory Management 也可以叫Non Cons
  • 内连接、外连接、左连接、右连接

    连接是使用一定条件将两个表合在在一起的操作 包括内连接 inner join 和外连接 outer join 1 内连接 等值连接 两个表中都满足相关条件的记录才被选择出来 2 外连接包括左外连接 左连接 left join 和右外连接 右
  • 美国一桶牛奶多少钱?

    你好 我是郭震 zhenguo 最近 关注我的朋友中有几位 想叫我多分享下美国的生活 今天我就从一个很小的生活点入手 牛奶 开始 牛奶在美国超市一般都是下面的这种大桶 比如Costco超市里 一般提供以下两种 口感有些不同 但是价格很相似
  • JAVA学习经验谈

    本文是我自2002年9月开始JAVA学习以来的一点经验之谈 首先我不是有丰富编程经验的程序员 所以本文不对JAVA的具体语法 编程技巧和设计模式做过多的论述 仅从个人的学习角度谈感受 由于有大学期间的C语言学习经历我对JAVA的基本语法相对

随机推荐

  • The Difference between Probability and Statistic

    本科数学专业 现在在PKU学习计算机 当前主要的focus是DNN RNN in Action Recognition 心中总有一股数学情结 OOAD 课程上老师提及这个问题 所以信誓旦旦地想写一篇博客 可惜最后发现雷声大 雨点小 先mar
  • 使用IDEA 对springboot项目进行打war包

    网上很多版本 以下是本人新建springboot项目后本地测试通过 好了上步骤 1首先这个地方需要配置
  • 多媒体讲解器基本型设计

    多媒体讲解器功能按照播放器功能和灯光控制功能分类 播放功能分类 简易型 具备按键操作功能 TF卡升级 在线播放 U盘升级 在线播放 具备人体接近检测功能 红外 雷达 自动播放讲解功能 自动停止讲解功能 自动播放音乐 自动切换到讲解功能 切换
  • Dart 断言(assert)和异常

    一 断言 assert 断言的作用是 如果表达式的求值结果不满足需要 则打断代码的执行 可以要将提示消息附加到断言 添加一个字符串作为第二个参数 实例 void main String urlString http www baidu co
  • Winsock状态说明及错误代码

    Winsock状态参数说明 常数 值 描述 sckClosed 0 缺省值 关闭 SckOpen 1 打开 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识
  • “定点打击”——XPath 使用细则(Just For Selenium WebDriver)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 Selenium WebDriver中有关元素定位的学习 需要XPath的支持 特此梳理 前言 XPath教程 XPath是一门在XML文档中查找信息的语言 XPat
  • 基于线性预测的语音编码原理解析

    早期的音频系统都是基于声音的模拟信号实现的 在声音的录制 编辑和播放过程中很容易引入各种噪声 从而导致信号的失真 随着信息技术的发展 数字信号处理技术在越来越多领域得到了应用 数字信号更是具备了易于存储和远距离传输 没有累积失真 抗干扰能力
  • SpringSecurity——OAuth2框架鉴权实现源码分析

    SpringSecurity OAuth2框架鉴权实现源码分析 一 ManagedFilter迭代过滤器链 1 4 springSecurityFilterChain 1 4 7 OAuth2AuthenticationProcessing
  • 【Redis】Redis在Windows下的使用(hiredis+Qt5.7.0+mingw5.3.0)

    1 下载hiredis https github com redis hiredis 得到hiredis master zip 解压后 得到hiredis master目录 可以看到CMakeLists txt 2 下载CMake http
  • Oracle12C 用户创建、修改、授权、删除、登录等操作

    1 以系统用户命令行登录 sqlplus sys sys as sysdba 2 确认选择CDB select name cdb from v database col pdb name for a30 select pdb id pdb
  • matlab绘图(三)绘制三维图像

    目录 一 绘制三维曲线 二 绘制三维曲面 1 meshgrid函数 2 mesh和surf函数 一 绘制三维曲线 1 最基本的绘制三维曲线的函数 plot3 plot3 x1 y1 z1 选项 1 x2 y2 z2 选项 2 xn yn z
  • 样本方差的分母为何为n-1而不是n之无偏估计

    设样本均值为 样本方差为 总体均值为 总体方差为 那么样本方差有如下公式 很多人可能都会有疑问 为什么要除以n 1 而不是n 但是翻阅资料 发现很多都是交代到 如果除以n 对样本方差的估计不是无偏估计 比总体方差要小 要想是无偏估计就要调小
  • 撸一撸Spring Cloud Ribbon的原理

    说起负载均衡一般都会想到服务端的负载均衡 常用产品包括LBS硬件或云服务 Nginx等 都是耳熟能详的产品 而Spring Cloud提供了让服务调用端具备负载均衡能力的Ribbon 通过和Eureka的紧密结合 不用在服务集群内再架设负载
  • html alert字体颜色,js里alert里的字体颜色怎么设置:字体颜色方法;fontcolor(color)...

    我的总结 alert应该是没办法改变的 只有自己写个弹出窗口才可以改变字体颜色 我的总结 alert应该是没办法改变的 只有自己写个弹出窗口才可以改变字体颜色 alert 投票总数不大于 不知道怎么改变字体所以查了下 找到下面的信息 好东西
  • 超强干货,Pytest自动化测试框架fixture固件使用,0-1精通实战

    前言 如果有以下场景 用例 1 需要先登录 用例 2 不需要登录 用例 3 需要先登录 很显然无法用 setup 和 teardown 来实现了 fixture 可以让我们自定义测试用例的前置条件 fixture 的优势 命名方式灵活 不局
  • std::thread的常用参数传递总结

    实参的生命周期 给std thread传递参数的时候要注意 参数是引用或者指针的情况下 要注意生命周期的问题 看代码 include
  • c++职工管理系统

    要求 代码 management system cpp main函数 include
  • hp服务器系统管理软件,惠普raid管理软件

    有HP服务器的RAID查看管理软件吗 1 创建分区 fdisk dev hda 创建两个要用做实验的新分区 比如hda5 hda6 2 cp usr share doc raidtools 1 0 0 2 raid0 conf sample
  • ASP.NET CORE 6.0实现SignalR

    当使用ASP NET Core Web API与SignalR结合 可以实现实时通信功能 以下是一些详细步骤 步骤一 创建ASP NET Core Web API项目 1 打开Visual Studio 选择创建新项目 2 选择 ASP N
  • C语言-一维数组、二维数组 (一篇文章带你彻底读懂!!!)

    数组简介 数组是相同数据类型的元素的集合 数组中的各元素的存储是有先后顺序的 它们在内存中按照这个先后顺序连续存放在一起 数组元素用整个数组的名字和它自己在数组中的顺序位置来表示 数组的特性 查询快 增删慢 为什么查询快 因为数组存在下标这