04- c语言数组 (C语言)

news2024/11/16 9:54:08

一 数组的概念

1、在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来,这些按序排列的 同类数据元素的集合 称为 数组
2、在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为 数值数组字符数组指针数组结构数组 等各种类别。
3、总结

  • 数组中的元素是 连续的(元素的内存地址连续)
  • 同一个数组 所有的成员 都是 相同的数据类型

二 一维数组

1、一维数组的定义语法规则
数据类型 数组名[常量表达式];
说明:

  • 数组名的命名规范必须满足标识符的命名规范
  • 方括号中的常量表达式就是 数组的长度,也就是数组中存储元素的个数

例如:
int a[10]; 说明整型数组a,有10个元素。
float b[10], c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素
char ch[20]; 说明字符数组ch,有20个元素。

2.1 一维数组的使用

1、使用下标访问数组中的元素

  • 下标的值必须为 整形常量/变量
  • 下标的值从 0开始数组长度-1 结束
  • 注意:如果使用的下标值 大于或者等于数组长度,程序仍然可以编译通过,但是运行 结果是未知的 !为何如此呢?请听下回分解!
#include <stdio.h>

int main()
{
    int a[10];//定义了一个数组,名字叫a,有10个成员,每个成员都是int类型
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        a[i] = i; //给数组赋值
    }
//遍历数组,并输出每个成员的值
    for (i = 0; i < 10; i++)
    {
        printf("view i:%d, data:%d \n",i, a[i]);
    }
    printf("\n");
    return 0;
}

2.2 、数组的初始化

给数组赋值的方法除了用赋值语句对数组元素 逐个赋值 外,还可采用 初始化赋值动态赋值 的方法。

int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//定义一个数组,同时初始化所有成员变量
int a[10] = { 1, 2, 3 };//初始化前三个成员,后面所有元素都设置为0
int a[10] = { 0 };//所有的成员都设置为0
//[]中不定义元素个数,定义时必须初始化
int a[] = { 1, 2, 3, 4, 5 };//定义了一个数组,有5个成员

注意:局部数组如果不初始化,内容为随机值

2.3 一维数组元素在内存中的存储

字符数组

#include <stdio.h>

int main()
{
    char ch[] = {'A', 'B', 'C','D'};
    int i;
    for (i = 0; i < 4; i++)
        printf("%p ", &ch[i]);
    printf("\n");

    return 0;
}

#include <stdio.h>

int main()
{
    int a[] = {1, 2, 3, 4};
    int i;
    for (i = 0; i < 4; i++)
        printf("%p ", &a[i]);
    printf("\n");
    return 0;
}

通过 **sizeof(数组名)** 可以求数组在内存中占用的字节数。
思考:假如有一维数组a,我们不知道数组中元素的数据类型,求数组a的长度 。

len = sizeof(a)/sizeof(a[0])

2.4 一维数组应用举例

1、一维数组的逆置

#include <stdio.h>
int main()
{
    int a[] = { 1, -2, 3,-4, 5, -6, 7, -8, -9, 10 };  //定义一个数组,同时初始化所有成员变量
    int i = 0;
    int j = sizeof(a) / sizeof(a[0]) -1;
    int tmp;
    while (i < j)
    {
        tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
        i++;
        j--;
    }
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        printf("view list a: %d \n", a[i]);
    }
    printf("\n");
    return 0;
}

2、删除一维数组中指定的元素

#include <stdio.h>
int main()
{
    int i,j,x,a[]={12,5,4,23,8,18,41,34,15,9};
    printf("输入要删除的数:");
    scanf("%d",&x);
    for(i=0;i<10;++i)
    {
        if(x==a[i])
        {
            for(j=i;j<9;++j) //删除指定的数
                a[j]=a[j+1];
            a[9]=0;
            break;
        }
    }
    if(i==10)
        printf("没有找到指定的数");
    else
    {
        for(i=0;i<9;++i) //输出删除后的数组
            printf("%d ",a[i]);
    }
    return 0;
}

三 二维数组

3.1 二维数组的定义

1、在实际应用中有许多数据是二维的,例如棋盘是有多行多列,如果使用C语言描述一个棋盘我们需要使用 二维数组

2、定义二维数组的语法规则 

数据类型 数组名[常量表达式1][常量表达式2];
说明:

  • 1)我们可以将二维数组当作一个有行有列的 二维矩阵
  • 2)常量表达式1代表矩阵的 行数
  • 3)常量表达式2代表矩阵的 列数
  • 4)二维数组可以理解为由  “常量表达式1”个一维数组 所组成的
int a[3][4];
//数组a是一个有3行4列的二维数组,数组中元素的数据类型为int

3.2 二维数组的使用

1、二维数组也同样通过下标对数组中的元素进行访问,与一维数组不同的是,二维数组元素的访问需要使用两个下标

  • 行下标 的值从 0开始 “常量表达式1”-1
  • 列下标 的值从 0开始 “常量表达式2”-1
  • 通过 双重循环访问 二维数组中的元素
#include <stdio.h>

int main()
{
    int a[2][3];
    int m, n;
//一行一行访问
    for (m = 0; m < 2; m++)
    {
        for (n = 0; n < 3; n++)
        {
            printf("%d ", a[m][n]);
        }
        printf("\n");
    }
//一列一列访问
    for (m = 0; m < 2; m++)
    {
        for (n = 0; n < 3; n++)
        {
            printf("%d ", a[n][m]);
        }
        printf("\n");
    }
    return 0;
}

2、二位数组的初始化

  • 分段赋值
//分段赋值 
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 };
  • 部分赋值
//可以只给部分元素赋初值,未初始化则为0
int a[3][4] = { 1, 2, 3, 4 };
  • 0值初始化
//所有的成员都设置为0
int a[3][4] = {0};
  • 不指定行数, 不能不指定列数
//[]中不定义元素个数,定义时必须初始化
int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8};

3、二维数组中元素在内存中的存储
在内存中并不存在二维数组,二维数组实际的硬件存储器是连续编址的,也就是说内存中只有一
维数组,即放完一行之后顺次放入第二行,和一维数组存放方式是一样的。

4、练习 

  • 求二维数组每一行的最大值并且打印出最大值的列号, 求每一列的最大值并且打印所在的行号
#include <stdio.h>
int main()
{
    int a[2][3] = {{1,2,3}, {4,5,6}};
    int max;
    int index, m, n;
    for (m = 0; m < 2; m++){
        max = a[m][0];
        index = 0;
        for (n = 0; n < 3; n++){
            if (a[m][n] > max){
                max = a[m][n];
                index = n;
            }
        }
        printf("1- max: %d, index: %d\n", max, index);
    }
    for (m = 0; m < 3; m++){
        max = a[0][m];
        for (n = 0; n < 2; n++){
            if (a[n][m] > max){
                max = a[n][m];
                index = n;
            }
        }
        printf("2-max: %d, index: %d\n", max, index);
    }
}
  • 求二维数组a[4][4]的对角线之和
#include <stdio.h>
int main()
{
    int a[4][4] = {{1, 2, 3, 4},
                   {5, 6, 7, 8},
                   {9 ,10,11,12},
                   {13,14,15,16}};
    int i,j;
    int sum =0;
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            if (j == i || j == 3-i)
            {
                sum += a[i][j];
                printf("view the data:%d\n", a[i][j]);
            }
        }
    }
    printf("%d\n", sum);
    return 0;
}

3 二维数组应用举例
1、一个学习小组有5个人, 每个人有三门功课。求全组分科的平均成绩

#include <stdio.h>
int main()
{
    int a[5][3] = {{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
    int v[3];
    int i, j, sum = 0;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 3; j++)
        {
            sum += a[i][j];
            printf("find everyone score:%d\n", a[i][j]);
        }
        v[i] = sum / 3;
        printf("view the mean ---------------------------------->: %d\n", v[i]);
        sum = 0;
    }
    return 0;
}

 2、求二维数组中的鞍点(有一个数满足:行中最大,列中最小)

#include <stdio.h>
int main()
{
    int m, n;
    int a[2][4] = {0};
    int max, index_col, min, index_row, k, row;
    for (m = 0; m < 4; m++)
    {
        max = a[m][0];
        index_col = 0;
        //求出当前行的最大值并且记住最大值的列号
        for(n = 0; n < 4; n++)
        {
            if (a[m][n]>max)
            {
                max = a[m][n];
                index_col = n;
            }
        }
        min = a[0][index_col];index_row = 0;
        // 求最大值所在的列上的最小值,并且记住最小值所在的行号
        for(k = 0; k < 4; k++)
        {
            if (a[k][index_col] < min)
            {
                min = a[k][index_col];
                row = k;
            }
        }
        //如果列上的最小值所在的行号和当前行是相等的
        if (index_row == m)
        {
            printf("下标为 [%d, %d] 的 %d 是鞍点!\n", m, index_col, min);
            break;
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣动态规划专题(三)完全背包 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯 322. 零钱兑换 279.完全平方数 步骤及C++实现

文章目录 完全背包一维dp数组 滚动数组 518.零钱兑换II377. 组合总和 Ⅳ70. 爬楼梯322. 零钱兑换279.完全平方数139.单词拆分 完全背包 完全背包的物品数量是无限的&#xff0c;01背包的物品数量只有一个 完全背包和01背包分许步骤一样&#xff0c;唯一不同就是体现在遍历顺序上…

deque的介绍

前言 为什么会存在deque呢&#xff1f;在c标准库中deque是作为 stack和queue的底层容器就是deque&#xff0c;我们要是了解过list和vector就会知道这两种容器各有优劣&#xff0c;vector的优点是支持随机访问&#xff0c;进而可以支持排序和二分查找等算法&#xff0c;它的缺点…

鼠标事件 获取鼠标坐标及点击事件

运行效果&#xff1a; 头文件 #ifndef MOUSEEVENT_H #define MOUSEEVENT_H #include #include #include #include class MouseEvent : public QMainWindow { Q_OBJECT public: MouseEvent(QWidget *parent 0); ~MouseEvent(); protected: void mousePressEvent(QMouse…

Linux:一键搭建ftp服务(vsftpd)

《TRO-23614-VSFTPD》 如果csdn收费 可以和我si liao 我会免费发给你 我发的这个是一个tar归档包&#xff0c;脚本就在其中 Linux&#xff1a;《tar》归档命令_鲍海超-GNUBHCkalitarro的博客-CSDN博客 tar xfz tarro_vsftpd.tar.gz -C /root/ # tar xfz tar包路径 -…

SpringBoot第27讲:SpringBoot集成MySQL - MyBatis 多个数据源

SpringBoot第27讲&#xff1a;SpringBoot集成MySQL - MyBatis 多个数据源 本文是SpringBoot第27讲&#xff0c;在某些场景下&#xff0c;Springboot需要使用多个数据源&#xff0c;以及某些场景会需要多个数据源的动态切换。本文主要介绍上述场景及 SpringBootMyBatis实现多个数…

【期末满分作业】C语言程序设计 实训1——奖学金评定系统的设计与实现(附带实验报告、源码以及解释)

大家好&#xff0c;各位努力奋斗的大学生小伙伴们&#xff01;今天&#xff0c;我将带你们领略一项令人惊叹的程序设计奇迹——《奖学金评定系统》&#xff01;是不是感到激动呢&#xff1f;别急&#xff0c;让我为你们揭开这个能让你在C语言程序设计中拿满分的秘密武器&#x…

ASP.NET Core MVC 从入门到精通之Identity入门

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

pikache靶场通关——XSS漏洞

文章目录 前言环境第一关、反射型xss(get)Step.1、输入特殊字符测试Step.2、输入js语句Step.3、在URL中输入js语句 第二关、反射性xss(post)Step.1、输入获取cookie的js语句 第三关、存储型xssStep.1、输入获取cookie的js语句Step.2、查看页面源码Step.3、感受危害性 第四关、D…

1 君正IPC芯片方案介绍

专栏特色 1、所有源码严格遵守统一的编码规范。 2、手把手教学&#xff0c;让你从零开始&#xff0c;深入了解君正方案IPC库的方方面面。 3、纯C接口&#xff0c;接口封装严谨&#xff0c;接口功能丰富&#xff0c;应用层调用简单便捷。 4、近二十年行业经验和技术积累打造的高…

风电光伏iEEE33节点蒙特卡洛概率潮流计算

基于蒙特卡洛法的概率潮流 以IEEE33节点的电网为研究对象 建立了光伏和风电的概率出力模型 采用蒙特卡洛法进行随机抽样 之后基于抽样序列进行概率潮流计算 最后得到电网的电压概率出力曲线

使用数字钥匙技术的车辆有多安全?

首发微信公众号网络研究院&#xff0c;关注获取更多。 虽然有几种不同的方法来实现汽车使用的数字钥匙&#xff0c;但安全的数字钥匙标准应该利用近场通信 (NFC) 和超宽带 (UWB) 结合蓝牙低功耗 (BLE) 来访问车辆&#xff0c;开始引擎&#xff0c;固定车辆&#xff0c;或授权各…

云原生之使用Docker部署Dashy个人导航页

云原生之使用Docker部署Dashy个人导航页 一、Dashy介绍1.1 Dashy简介1.2 Dashy特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、部署前准备工作4.1下载Dashy源码包4.2 查看D…

vue基础-ref (!)

&#xff01;1、ref 引用 在父组件中直接去调 子组件中的方法&#xff0c;使用ref 很简单&#xff0c;比父子传值 简单很多 1、使用ref引用DOM元素 第一步&#xff1a;给标签里 写 ref“xxx” 第二步&#xff1a;就可以用this.$refs.xxx 来拿到这个元素 使用 ! 2、使用ref引…

Spring - Bean的6种作用域

1、Bean作用域问题2、作用域定义2.1、Bean的6种作用域singleton 单例模式prototype 原型作用域request 请求作用域session 会话作用域application 全局作用域&#xff08;了解&#xff09;websocket 单例作用域 vs 全局作用域 2.设置作用域 1、Bean作用域问题 通过一个案例来看…

[工业互联-10]:PLC入门简介

目录 前言 PLC的用途 PLC的特点 PLC的分类 1、按PLC的控制规模分类 2、按PLC的控制性能分类 3、按PLC的结构分类 PLC的技术指标 1、硬件指标 2、软件指标 3、主要性能指标介绍 1) 存储容量 2) 输入/输出&#xff08;I/O&#xff09;点数 3) 扫描速度 4) 指令的功…

【Redis】五种数据结构

在内存种种存储形式如下&#xff1a;

练习2:逻辑回归

练习2&#xff1a;逻辑回归 介绍 在本练习中&#xff0c;您将实现逻辑回归并将其应用于两个不同的数据集。还将通过将正则化加入训练算法&#xff0c;来提高算法的鲁棒性&#xff0c;并用更复杂的情形来测试模型算法。 在开始练习前&#xff0c;需要下载如下的文件进行数据上…

90后程序员回家卖羊粪,月销售额120万!

不得不说&#xff0c;程序员是一个勤奋而又善于思考的群体。他们不只是代码写得好&#xff0c;善于逻辑思维&#xff0c;即使有一天不做程序员&#xff0c;转行其他岗位了&#xff0c;也能在新的岗位上面玩出花样。 早在2013年的时候&#xff0c;就有一位新浪的PHP程序员转行卖…

单点登录:CAS使用springboot main方法启动cas-server

1.下载demo git clone https://gitee.com/pelin0963/cas-server.git2.使用eclipse导入maven项目。此次我是用的spring tool suite 4导入的。 导入时会用较长时间&#xff0c;10分钟吧。需要下载很多资源。 3.报错&#xff0c;提示缺少jar包 Missing artifact net.shibbolet…

【java】使用 BeanUtils.copyProperties 11个坑(注意事项)

文章目录 背景第1个坑&#xff1a; 类型不匹配第2个坑: BeanUtils.copyProperties是浅拷贝第3个坑&#xff1a;属性名称不一致第4个坑&#xff1a;Null 值覆盖第5个坑&#xff1a;注意引入的包第6个坑&#xff1a;Boolean类型数据is属性开头的坑第7个坑&#xff1a;查找不到字段…