【C语言数组部分】

news2024/10/5 19:18:12

数组部分综述

  • 引入:
    • 数组概念:
  • 一、一维数组
    • 1.1一维数组的创建:
    • 1.2一维数组的初始化:
      • 1.2.1初始化概念:
      • 1.2.2完全初始化:
      • 1.2.3不完全初始化:
    • 1.3字符数组的初始化:
      • 1.3.1用字符初始化:
      • 1.3.2用字符串初始化:
      • 1.3.3字符数组用字符初始化和字符串初始化的差别:
    • 1.4一维数组的使用(下标引用)
    • 一维数组在内存中的存储:
  • 二、二维数组
    • 2.1二维数组的创建:
    • 2.2二维数组的初始化
    • 2.3二维数组的使用
    • 2.4二维数组在内存中的存储形式
  • 三、数组作为函数参数
    • 冒泡排序(将降序的arr数组排为升序):
      • C语言实现:
    • 注意:

引入:

数组概念:

一类相同类型(整数型/小数型/字母型)元素的集合

一、一维数组

1.1一维数组的创建:

数组元素类型 数组名 [常量表达式]

  • 方括号内必须是常量
  • C99语法支持变长数组(方括号内可以是变量),大部分情况下不建议使用。

1.2一维数组的初始化:

1.2.1初始化概念:

创建的同时并给与相应的值。

1.2.2完全初始化:

  • int arr[10]={1,2,3,4,5,6,7,8,9,10};
  • int arr[]={1,2,3,4,5};等价于int arr[5]={1,2,3,4,5};

1.2.3不完全初始化:

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

1.3字符数组的初始化:

1.3.1用字符初始化:

char ch[5]={‘a’,‘b’,‘c’}; 实际存储:‘a’,‘b’,‘c’,‘\0’,‘\0’

char ch2[]={‘a’,‘b’,‘c’}; 实际存储就是’a’,‘b’,‘c’

1.3.2用字符串初始化:

char ch3[5]=“abc”; 用字符串存储于字符数组:实际存储‘a’,‘b’,‘c’,‘\0’,‘\0’

char ch4[]=“bit”; 实际存储:‘a’,‘b’,‘c’,'\0‘仅有4个元素

##在这里插入图片描述

1.3.3字符数组用字符初始化和字符串初始化的差别:

样例

  • 直观差别

用字符串初始化数组中个数有4个(除了a,b,c还有字符串结束标志’\0’)
在这里插入图片描述

用字符初始化的只有三个元素,没有结尾’\0’
在这里插入图片描述

  • 解析:

打印结果:
在这里插入图片描述
arr2打印乱码原因:

  • 在内存中,arr1用字符串初始字符数组开拓4个空间,打印遇到了字符串结束标志’\0’结束。
  • 在内存中,arr2用字符初始字符数组只开拓3个空间,打印a,b,c过程中没有遇到字符串结束标志。因此会打印字符c后内存中未知的存储内容,直到读到字符串结束标志。

因此求两字符数组的长度时,也会存在差异:
在这里插入图片描述
字符数组arr2的长度是随机值

1.4一维数组的使用(下标引用)

下标引用操作符:[ ]

注意:

  • 数组下标从0开始
  • sizeof(数组名)计算的是整个数组的大小,单位字节

总结:

1:数组用下标访问
2:数组的大小可以计算得到
在这里插入图片描述

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

在这里插入图片描述
%p是打印地址格式控制(以16进制打印地址)
在这里插入图片描述
数组元素位置相邻的相差4(字节)
因此

  • 一维数组在内存中连续存放
  • 随数组下标增长,地址增长
  • 找到数组的首地址就可以找到整个数组

又因为数组名即为首元素地址

p++:指向数组中下一元素(在内存中跳过一个该指针变量所指向的元素类型所占的字节数)

二、二维数组

2.1二维数组的创建:

有行有列
在这里插入图片描述
第一个方括号内的数字代表行数,第二个数字代表列数。因此创建的这个数组为3行4列。

2.2二维数组的初始化

  • int arr[3] [4]={1,2,3,4,5,6,7,8,9,10,11,12};
  • 不完全初始化:int arr[3] [4]={1,2,3,4,5,6,7};后边会自动补0
  • 可以看作多个一维数组 :int arr[3] [4]={{1,2},{3,4},{5,6}}每个一维数组不够时补0

注意:
行可以省略
但是列不能省略,因为列决定每行元素的个数(使没行元素个数是确定的)

2.3二维数组的使用

和一维数组相同,都是通过数组的下标来访问数组中的元素:行号从0开始,列号也从0开始
在这里插入图片描述

2.4二维数组在内存中的存储形式

在这里插入图片描述可以观察到,换行时元素在内存中的字节数仍然相差为4.因此——————》

二维数组在内存中本质上也是连续的,每一行内部是连续的,换行时也是连续的(行与行之间也是连续的)。
在这里插入图片描述
只要拿到二维数组中的首元素arr[0[[0]的地址就能找到该二维数组数组所有的元素!
在这里插入图片描述

  • 第一行的元素可以看作arr[0]+0,1,2,3
  • 第二行的元素可以看作arr[1]+0,1,2,3
  • 第三行的元素可以看作arr[2]+0,1,2,3

三、数组作为函数参数

冒泡排序(将降序的arr数组排为升序):

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

使用自定义函数bubble_sort

冒泡排序地思想:
相邻两个元素进行比较,并且可能地话需要交换!
9来到最后时候(排了一趟)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYkeD7oS-1681175613152)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230411082933671.png)]
10个数字,冒泡排序需要进行9趟(9趟后,剩下的一个已经在应该的位置)

如果是n个数字,需要进行n-1趟

第一趟:10个数字待排序,9对比较

第二趟:9个数字的待排序,8对比较

第三趟:8个数字待排序,7对比较

C语言实现:

void bubble_sort(int arr[],int sz)
{
	//1 确定趟数(sz-1趟)
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的过程
		int j = 0;
		/*/
		一趟中需要进行比较的对数
		i=0,进行第一趟比较,比较的对数为9
		i=1,进行第二趟比较,比较的对数为8
		*/
		for (j = 0; j < sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])//前大于后的话就进行交换
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	//计算数组中元素的个数
	int sz = sizeof(arr) / sizeof(arr[0]);
	//冒泡排序
	bubble_sort(arr, sz);
	return 0;
}

注意:

数组传参的时候,传递的本质上传递的是首元素的地址(数组名是数组首元素的地址),形参arr本质上是指针。

x86平台(32位平台)

x64(64位机器)

在这里插入图片描述

》但是有2个例外:

(1)sizeof(数组名):这时的数组名表示的整个数组,计算的是整个数组的大小,单位是字节

(2)&数组名:这时数组名表示整个数组,取出的是整个数组的地址

在这里插入图片描述
打印结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMFxuU2h-1681175700908)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230411090212135.png)]

(2)和(3)是相同的

(1)取出的是整个数组的地址,那整个数组的地址和数组首元素的地址一样?

的确一样:打印出的值一样的,意义不一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9swOmwz-1681175700909)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230411090325712.png)]

如何显示出&arr和&arr[0](arr)的意义不同:

对&arr+1和&arr[0]+1进行比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zF46dk2A-1681175700910)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230411090559724.png)]

&arr+1比&arr大了40(16进制的28)

&arr[0]+1比&arr大了4

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

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

相关文章

如何解决spring的循环依赖问题?

前言 昨天我们说了什么是spring的循环依赖&#xff0c;以及产生的原因&#xff0c;今天那我们就来说说如何解决spring的循环依赖问题。 上篇文章说到过&#xff0c;只有通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题是被解决的&#xff1f; Spring是怎样解决…

rhce第二次作业

配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 [root456 ~]# hostname host [root456 ~]# bash \\更改名称[roothost ~]# su redhat …

2023年腾讯云S5云服务器性能网络收发包PPS、连接数、内网带宽能力等性能测评

腾讯云服务器标准型S5实例CPU采用Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;主频2.5GHz&#xff0c;睿频3.1GHz&#xff0c;标准型S5云服务器基于全新优化虚拟化平台&#xff0c;配有全新的Intel Advanced Vector Extension (AVX-512) 指令集&#…

微服务+springcloud+springcloud alibaba学习笔记【Spring Cloud服务网关】(7/9)

Spring Cloud服务网关 7/91、GateWay概述2、GateWay的特性:3、GateWay与zuul的区别:4、zuul1.x的模型:5、什么是webflux:6、GateWay三大概念:6.1,路由:6.2,断言:6.3,过滤:7、GateWay的工作原理:8、使用GateWay:8.1,建module8.2,修改pom文件8.3,写配置文件8.4,主启动类8.5,针对p…

Springboot 整合 Redis 进行基本操作

SpringBoot整合Redis 首先创建 Springboot 项目。 spring-data-redis针对jedis提供了如下功能&#xff1a;1.连接池自动管理&#xff0c;并提供了一个高度封装的“RedisTemplate”类2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口ValueOperat…

计网第六章.应用层各协议概览

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一. C/S方式和P2P对等方式二. 动态主机配置协议DHCP三.域名系统DNS域名解析过程四.文件传输协议FTP基本工作原理&#xff1a;五.电子邮件六.万维网www万维网的文档6.1 HTTP&#xff08;HyperText Transfer Protocol&am…

左手Python 右手R —— 最大公约数和最小公倍数

左手Python 右手R —— 最大公约数和最小公倍数前言1、 最大公约数1.1 约数1.2 最大公约数1.3 求解方法2、 最小公倍数2.1 倍数2.2 最小公倍数2.3 求解方法3、程序实现3.1 python 代码实现3.2 R语言代码实现小结创作不易&#xff0c;都浏览到这儿了&#xff0c;看官可否将下面的…

【Linux系统创建,修改用户和组和修改目录文件的权限以及实验的心得体会】

实验过程 1.创建一个新用户nick,设置其主目录为home/nick。 &#xff08;1&#xff09;添加新用户&#xff1a; sudo useradd -m 用户名 sudo passwd 新用户名 &#xff08;2&#xff09;给新用户可以执行的root权限 sudo vi /etc/sudoers #User privilege specification roo…

Spring Security实战(一)——基于内存和数据库模型的认证与授权

目录 简介 一、初识Spring Security&#xff08;入门案例&#xff09; &#xff08;1&#xff09;新建project &#xff08;2&#xff09;选择依赖 &#xff08;3&#xff09;编写一个 HelloController &#xff08;4&#xff09;启动项目&#xff0c;访问localhost:8080…

手动清除gitlab中prometheus的数据

背景&#xff1a; gitlab服务器上&#xff0c; 磁盘经常爆满。后来通过 du -sh ./* 查出prometheus下的data占了绝大多数磁盘空间。 因此&#xff0c;准备删除prometheus的数据。 思路 由于prometheus的数据占用的空间较大&#xff0c;因此在实际使用时&#xff0c;可以关闭…

【 Spring MVC 核心功能(一) - 使用注解实现 URL 路由映射】

文章目录引言一、RequestMapping 注解介绍1.1 RequestMapping 是 post 还是 get 请求&#xff1f;1.2 RequestMapping 指定一种请求方式二、GetMapping三、PostMapping四、总结引言 前面我们讲到&#xff0c;学习 Spring MVC 需要掌握三个核心功能即连接&#xff0c;获取参数&…

avi文件怎么转成mp4视频,3种方法快速学

avi文件怎么转成mp4视频&#xff1f;前面小编给大家讲了mov格式和webm格式&#xff0c;以及如何将mov和webm格式转换成mp4格式。今天小编给大家说一说另外一种视频格式&#xff0c;就是avi&#xff0c;AVI英文全称为Audio Video Interleaved&#xff0c;即音频视频交错格式&…

SpringBoot中对Bean的处理方法以及第三方Bean处理的方式

我们可以通过Spring当中提供的注解Component以及它的三个衍生注解&#xff08;Controller、Service、Repository&#xff09;来声明IOC容器中的bean对象&#xff0c;为应用程序注入运行时所需要依赖的bean对象&#xff0c;也就是依赖注入DI。 关于IOC容器中Bean的其他使用细节…

矿泉水为什么会溴酸盐超标

矿泉水为什么会溴酸盐超标&#xff1f; 水生产企业多使用臭氧消毒&#xff0c;不过&#xff0c;水生产企业不存在水运输路途遥远的问题&#xff0c;因此可以使用臭氧消毒。同时&#xff0c;也是因为臭氧在消毒后会直接变成氧气&#xff0c;所以不会有使用氯消毒后的那种味道&a…

give_you_flag(GIF原理、二维码定位符)

下载附件是一个GIF 看到最后你会发现它突然漏了一个二维码出来 我们将这个GIF分解成图片&#xff08;动图就是由多张静态图片组合而成&#xff0c;按照一定的顺序和时间播放的&#xff09; https://tu.sioe.cn/gj/fenjie/ 提取出里面包含二维码的那张 但是我们发现这里有一个…

word2vec原理

1.背景 2013年&#xff0c;Google开源了一款用于词向量计算的工具—word2vec&#xff0c;引起了工业界和学术界的关注。首先&#xff0c;word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练&#xff1b;其次&#xff0c;该工具得到的训练结果——词向量(word embed…

GDPU C语言 天码行空7

1. 数组最大值交换 ⭐ 1e9&#xff1a;10的9次方 #include<stdio.h>int main() {int n, i,idx 0;//idx 记录第一个出现的最大值下标scanf("%d", &n);double a[30];double max -1e9;// 1e9 表示10的9次方&#xff0c;十亿&#xff0c;int 的最大范围级别…

使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目

STM32CubeMX下载 RT-Thread Studio下载 安装好RT-Thread Studio后&#xff0c;先打开RT-Thread SDK管理器确认有没有自己MCU需要的SDK包&#xff0c;直接安装好之后里面是有STM32F1系列的SDK包&#xff0c;其他的需要自己安装。 之后点击文件→新建→RT-Thread项目&#xff0…

C++ 实现 matlab 的 zp2tf 函数

文章目录1. matlab 的 zp2tf 函数的作用2. matlab 的 zp2tf 函数的使用方法3. C实现3.1 complex.h 文件3.2 zp2tf.h 文件4. 测试结果4.1 测试文件4.2 测试结果1. matlab 的 zp2tf 函数的作用 作用是将极点形式的 H(s) 函数的分母展开 2. matlab 的 zp2tf 函数的使用方法 [z,…

ICASSP2023 | 基于多任务学习的保留背景音的语音转换

在影视、有声书内容中&#xff0c;背景音是一种表现丰富的艺术形式。语音转换&#xff08;Voice Conversion&#xff09;如能将源说话人语音转换成目标说话人语音的同时&#xff0c;保留源语音中的背景音&#xff0c;将会提供更沉浸的语音转换体验。之前的语音转换研究主要关注…