【C语言回顾】数组

  • 前言
  • 1. 数组
  • 2. 一维数组
    • 2.1 一维数组的创建
    • 2.2 一维数组的初始化
    • 2.3 一维数组的使用
      • 2.3.1 一维数组的下标
      • 2.3.2 一维数组的输入和输出
    • 2.4 一维数组在内存中的存储
  • 3. 二维数组
    • 3.1 二维数组的创建
    • 3.2 二维数组的初始化
    • 3.3 二维数组的使用
      • 3.3.1 二维数组的下标
      • 3.3.2 二维数组的输⼊和输出
    • 3.4 二维数组在内存中的存储
  • 4. sizeof 计算数组元素个数
  • 5. 变长数组
  • 6. 练习强化
    • 6.1 练习
    • 6.2 答案
  • 结语


在这里插入图片描述
上期回顾: 【C语言回顾】分支和循环

前言

各位小伙伴,大家好!话不多说,我们直接进入正题。
以下是C语言数组的讲解。

1. 数组

【概念】数组是⼀组相同类型元素的集合。

  • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
  • 数组中存放的多个数据,类型是相同的。

【分类】数组分为一维数组、二维数组和多维数组。

2. 一维数组

2.1 一维数组的创建

type arr_name[常量值];

int math[20];
char ch[8]; 
double score[10]; 

2.2 一维数组的初始化

//完全初始化 
int arr[5] = {1,2,3,4,5}; 

//不完全初始化 
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0 

//错误的初始化 - 初始化项太多 
int arr3[3] = {1, 2, 3, 4};

2.3 一维数组的使用

2.3.1 一维数组的下标

C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号。
【示例】

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

【输出】
在这里插入图片描述

2.3.2 一维数组的输入和输出

【数组输入】

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

【数组输出】

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

【输出】1 2 3 4 5 6 7 8 9 10

2.4 一维数组在内存中的存储

【依次打印数组元素的地址】

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

在这里插入图片描述
【结论】数组在内存中是连续存放的

3. 二维数组

数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。
在这里插入图片描述

3.1 二维数组的创建

type arr_name[常量值1][常量值2]int arr[3][5]; 
double data[2][8]; 

【解释】

  • 表⽰数组有3⾏。
  • 5表⽰每⼀⾏有5个元素。
  • int 表⽰数组的每个元素是整型类型。
  • arr 是数组名,可以根据⾃⼰的需要指定名字。
  • data数组意思基本⼀致。

3.2 二维数组的初始化

//不完全初始化
int arr1[3][5] = {1,2}; 
int arr2[3][5] = {0}; 

//完全初始化 
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

//按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};

//初始化时省略⾏,但是不能省略列
int arr5[][5] = {1,2,3}; 
int arr6[][5] = {1,2,3,4,5,6,7}; 
int arr7[][5] = {{1,2}, {3,4}, {5,6}}; 

3.3 二维数组的使用

3.3.1 二维数组的下标

int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; 
#include <stdio.h> 
int main() 
{ 
 int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; 
 printf("%d\n", arr[2][4]); 
 return 0; 
} 

【输出】7

3.3.2 二维数组的输⼊和输出

#include <stdio.h>
int main()
{
        int arr[3][5] ={ 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
        int i = 0;//遍历⾏
        //输⼊
        for(i=0; i<3; i++) //产⽣⾏号
        {
                int j = 0;
                for(j=0; j<5; j++) //产⽣列号
                {
                        scanf("%d",&arr[i][j]); //输⼊数据
                }
        }
        //输出
        for(i=0; i<3; i++) //产⽣⾏号
        {
                int j = 0;
                for(j=0; j<5; j++) //产⽣列号
                {
                        printf("%d ",arr[i][j]); //输出数据
                }
                printf("\n");
        }
        return 0;
}

3.4 二维数组在内存中的存储

#include <stdio.h>
int main()
{
        int arr[3][5] ={ 0 };
        int i = 0;
        int j = 0;
        for(i = 0; i < 3; i++)
        {
                for(j = 0; j < 5; j++)
                {
                        printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
                }
        }
        return 0;
}

在这里插入图片描述
【分析】从输出的结果上看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。

4. sizeof 计算数组元素个数

sizeof是C语言中计算类型或者变量⼤⼩的关键字。因此我们可以用sizeof实现数组⼤⼩的计算。

#include <stido.h> 

int main() 
{ 
 int arr[10] = {0}; 
printf("%d\n", sizeof(arr)); 
return 0; 
}

【输出】40

【计算出⼀个元素所占字节的个数】

#include <stido.h> 
int main() 
{ 
 int arr[10] = {0}; 
 printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节 
 return 0; 
}

【计算数组的元素个数】

#include <stido.h> 
int main() 
{ 
 int arr[10] = {0}; 
 int sz = sizeof(arr)/sizeof(arr[0]); 
 printf("%d\n", sz); 
 return 0; 
}

【输出】10

5. 变长数组

变长数组允许我们使用变量来指定数组大小

int n = 0;
arr[n]

上述实例中,数组arr就是变长数组,因为它的长度取决于变量n的值,编译器没法实现确定,只有运行时才能够得知n是多少。

变长数组的根本特征是在运行时才可以确定数组的长度,所以变长数组不能初始化

【请公主王子们在gcc环境下测试以下代码】

#include <stdio.h> 
int main() 
{ 
	int n = 0; 
	scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩ 
 	int arr[n]; 
 	int i = 0; 
 	for (i = 0; i < n; i++) 
 	{ 
 		scanf("%d", &arr[i]); 
 	} 
 	for (i = 0; i < n; i++) 
 	{ 
 		printf("%d ", arr[i]); 
 	} 
 	return 0; 
}

6. 练习强化

6.1 练习

1. 实现多个字符从两端移动,向中间汇聚
2. 实现二分查找

【二分查找】在⼀个升序的数组中查找指定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低。⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4…这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了,这就是⼆分查找,也叫折半查找。

6.2 答案

【解析1】

#include <stdio.h>
int main()
{
        char arr1[] = "welcome to bit...";
        char arr2[] = "#################";
        int left = 0;
        int right = strlen(arr1)-1;
        printf("%s\n",arr2);
        while(left<=right)
        {
                Sleep(1000);
                arr2[left] = arr1[left];
                arr2[right] = arr1[right];
                left++;
                right--;
                printf("%s\n",arr2);
        }
        retutn 0;
}

【解析2】

#include <stdio.h>
int main()
{
        int arr[] ={ 1,2,3,4,5,6,7,8,9,10 };
        int left = 0;
        int right = sizeof(arr)/sizeof(arr[0])-1;
        int key = 7;//要找的数字
        int mid = 0;//记录中间元素的下标
        int find = 0;
        while(left<=right)
        {
                mid = (left+right)/2;
                if(arr[mid]>key)
                {
                        right = mid-1;
                }
                else if(arr[mid] < key)
                {
                        left = mid+1;
                }
                else
                {
                        find = 1;
                        break;
                }
        }
        if(1 == find)
                printf("找到了,下标是%d\n",mid);
        else
                printf("找不到\n");
}

结语

以上就是小编对C语言数组的讲解。
如果觉得小编讲的还可以,还请一键三连!互三必回!
持续更新中~!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lesson2: 算法的时间复杂度和空间复杂度

【本节目标】 1. 算法效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度 oj 练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数列&#xff1a; long long Fib(int N) {if(N < 3)return 1;retu…

【模板】差分

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 2 1 2 3 1 2 4 3 3 -2 输出 5 6 1 思路&#xff1a; 一直以来&#xff0c;我总是不太理解差分和树状数组操作区别。 现在摸了一下开始有所理解了。 差分和树状数组的区别…

houdini assemble connectivity partion

官方文档 *****分开打包 非连续物体 各部份 打组 操作 partion connectivity assemble 三个物体&#xff0c;每个物体内的点&#xff0c;面线连接在一起&#xff0c;但每个物体之间分离 connectivity 查看点面数据属性&#xff1a;在原有属性上的变化 connectivity 对将归…

如何优化邮箱Webhook API发送邮件的性能?

邮箱Webhook API发送邮件的流程&#xff1f;怎么用邮箱API发信&#xff1f; 高效、稳定的邮箱Webhook API发送邮件功能对于企业的日常运营至关重要。随着业务量的增长&#xff0c;如何优化邮箱Webhook API发送邮件的性能。AokSend将从多个方面探讨如何提升的效率。 邮箱Webho…

访问者模式【行为模式C++】

1.概述 访问者模式是一种行为设计模式&#xff0c; 它能将算法与其所作用的对象隔离开来。 访问者模式主要解决的是数据与算法的耦合问题&#xff0c;尤其是在数据结构比较稳定&#xff0c;而算法多变的情况下。为了不污染数据本身&#xff0c;访问者会将多种算法独立归档&…

画板探秘系列:创意画笔第一期

前言 我目前在维护一款功能强大的开源创意画板。这个画板集成了多种创意画笔&#xff0c;可以让用户体验到全新的绘画效果。无论是在移动端还是PC端&#xff0c;都能享受到较好的交互体验和效果展示。并且此项目拥有许多强大的辅助绘画功能&#xff0c;包括但不限于前进后退、…

抖音24年4月16新规发布,“有效粉丝”少于500无法带货!

我是王路飞。 2024年4月16日&#xff0c;抖音发布了堪称今年“最严新规”。 调整了个人号视频/图文电商带货权限&#xff0c;个人号开通视频/图文的商品推广要求&#xff0c;粉丝要求从“粉丝量>1000”调整为"有效粉丝量>500"。 看似对粉丝数量的要求减少了…

Dynamics 365: 给D365设置一个黑色主题

在领英上看到一个好玩的东西&#xff0c;给D365可以设置暗黑的主题&#xff0c;但是这个目前我试了一下&#xff0c;仍然需要适配&#xff0c;很多地方显示的还是白色的&#xff0c;比如dashbaord里。 具体设置方法&#xff1a; 1. 设置你的D365为New Look新外观 2. 在D365的…

van-uploader 在app内嵌的webview中的一些坑

问题&#xff1a; 部分版本在ios 中没有问题&#xff0c;但是安卓中不触发图片选择和拍照&#xff08;之前是可以的&#xff0c;可能是没有锁定版本&#xff0c;重新发版导致的&#xff09;。在ios中下拉文案是英文&#xff0c;html配置lang等于 zh 也没有用&#xff0c;ios里…

护眼灯什么价位的好?五款性价比高的学生用台灯推荐!

在为学生选择护眼灯时&#xff0c;价格与性价比常常是家长们考虑的重点。价格并非唯一标准&#xff0c;但合适的价位确实能够让我们找到性价比高的产品。今天&#xff0c;我将为大家推荐五款特别适合学生使用的台灯&#xff0c;它们不仅价格适中&#xff0c;而且性能优越&#…

Windows电脑使用Everything+cpolar搭建在线资料库并实现无公网IP管理文件

文章目录 推荐前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

【办公类-21-15】 20240410三级育婴师 712道单选题(题目与答案合并word)

作品展示 背景需求&#xff1a; 前文将APP题库里的育婴师题目下载到EXCEL&#xff0c;并进行手动整理 【办公类-21-13】 2024045三级育婴师 721道单选题 UIBOT下载整理-CSDN博客文章浏览阅读451次&#xff0c;点赞10次&#xff0c;收藏3次。【办公类-21-13】 2024045三级育婴…

【学习】软件信创测试中,如何做好兼容性适配

在软件信创测试的领域中&#xff0c;兼容性适配是至关重要的一环。如何确保软件在不同的操作系统、硬件设备和软件环境中稳定运行&#xff0c;是每个测试人员需要面对的挑战。本文将从几个方面探讨如何做好兼容性适配&#xff0c;以提高软件的稳定性和用户体验。 首先&#xf…

STM32学习和实践笔记(12):蜂鸣器实验

蜂鸣器主要分为两种&#xff0c;一种是压电式的无源蜂鸣器&#xff0c;一种是电磁式的有源蜂鸣器。 有源和无源是指其内部有没有振荡器。 无源的没有内部振荡器&#xff0c;需要输入1.5-5KHZ的音频信号来驱动压电蜂鸣片发声。 有源的内部有振荡器&#xff0c;因此只需要供给…

真实用户见证:爱校对——让您的文字更准确,工作更轻松

在快节奏的工作和学习中&#xff0c;精确无误的文字输出显得尤为重要。爱校对&#xff0c;一款依托清华大学计算机智能人机交互实验室的技术成果开发的校对工具&#xff0c;旨在帮助用户提升文字质量&#xff0c;确保沟通无误。 主体&#xff1a; 核心技术&#xff1a;爱校对…

COOH-Dextran羧基功能化葡聚糖 水凝胶药物载体

COOH-Dextran羧基功能化葡聚糖 水凝胶药物载体 【中文名称】羧基化葡聚糖 【英文名称】Dextran-COOH 【分 子 量】2K/3k/5K/10K/20K/40K/70K/100K/200k/400k/500k/1000k...... 【结 构 式】 【品 牌】碳水科技&#xff08;Tanshtech&#xff09; 【纯 度】95%以上 【…

【40分钟速成智能风控16】模型训练

目录 ​编辑 模型训练 逻辑回归 XGBoost Wide&Deep 模型部署 模型训练 确定了最终的入模变量&#xff0c;终于进入模型训练的环节了&#xff0c;在这个环节我们需要选定模型结构&#xff0c;调节模型超参数&#xff0c;以及评估模型的效果。为了得到一个兼具区分度和…

MySQL学习笔记3——条件查询和聚合函数

条件查询和聚合函数 一、条件查询语句二、聚合函数1、SUM&#xff08;&#xff09;2、AVG()、MAX()、MIN()3、COUNT&#xff08;&#xff09; 一、条件查询语句 WHERE 和 HAVING 的区别&#xff1a; WHERE是直接对表中的字段进行限定&#xff0c;来筛选结果&#xff1b;HAVIN…

相交链表(双指针)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据…

#猫咪养护机模块功能分析

1.供电部分 AC转DC模块 220V交流转12V直流 系统的整体供电模块&#xff0c;可以直接接入220V交流电&#xff0c;并且输出12V直流电&#xff0c;12V直流电一方面供电给TB6600电机驱动板&#xff0c;一方面供电给PTC加热模块&#xff0c;还有一方面接入DCDC直流12转直流5V模块供…