第五章 数组

这篇具有很好参考价值的文章主要介绍了第五章 数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第五章 数组,C语言初阶知识,java,开发语言
🔥博客主页 小羊失眠啦.
🔖系列专栏 C语言
🌥️每日语录不怕路长,只怕志短。
❤️感谢大家点赞👍收藏⭐评论✍️


第五章 数组,C语言初阶知识,java,开发语言

定义

数组是一组相同类型元素的集合,但我们需要创建多个相同类型的变量时,只需要创建一个类型的数组,就相当于同时创建很多相同类型的变量。


一维数组

数组如何创建

从定义来入手看一下数组的创建:

type_t arr_name[const_n];
  • type_t是指元素的类型;
  • arr_name是数组名;
  • const_n是一个常量表达式,用来指定数组的大小;

可以简易为:
元素类型 数组名[元素个数]
eg:

int arr[10] 

意思是:创建一个名为arr数组,数组中存储着10个元素,每个元素类型为int类型

变长数组

在创建数组时候,我们可能会想过使用以下方法创建数组

int n=10;
int arr[n];

当然这种方法是不可行的
原因:在c99标准之前,数组的大小只能是常量表达式,在c99标准中引入了变长数组的概念,使得数组的大小可以是变量,但这样的数组不能初始化,vs2019或vs2022这样的编译器(IDE)不支持c99中变长数组,但gcc编译器可以。

数组初始化

一维数组在创建时 ,未给出确定的数组大小值,则该数组必须得初始化,数组的大小根据初始的内容来确定。故数组的初始化是指,在创建数组的同时给数组的内容一些合理的初始值。

用法示例

   int arr1[10] = { 1 };
   int arr2[] = { 1,2,3,4 };
   int arr3[5] = { 1,2,3,4,5 };
   char arr4[3] = { 'a',98,'c' };
   char arr5[] = { 'a','b','c' };
   char arr6[] = "abcdef";

一维数组的使用

  • 我们一般使用操作符:[ ] (下标引用操作符)来对数组中的某个位置的元素进行访问;
  • 数组元素的下标是从0开始

用法示例

从键盘输入十个数,并将他们打印在屏幕上

#include<stdio.h>
int main()
{
   int arr[10] = { 0 };
   int sz = sizeof(arr) / sizeof(arr[0]);
   int i = 0;
   for (i = 0; i < sz; i++)
   	scanf("%d", &arr[i]);
   for (i = 0; i < sz; i++)
   	printf("%d ", arr[i]);
   return 0;
}

我们一般用关键字sizeof来求数组的长度

  • sizeof(arr)表示整个数组的大小
  • sizeof(arr[0])表示计算数组中首元素的大小,即每个元素的大小
  • 数组元素个数=数组总大小/数组每个元素大小

一维数组的存储

数组在内存中是怎样存储的呢?我们先来看一段代码:

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

注意:%p是打印地址的格式输出符号
这段代码是将数组每个元素的地址打印出来,结果如下:
第五章 数组,C语言初阶知识,java,开发语言
由结果而知,随着数组下标的增长,元素的地址是在由规律的递增,并且相邻元素地址相差4,正好是一个int类型的大小,所以我们得知,数组在内存中是连续存放的。


二维数组

二维数组的创建

二维数组的创建与一维数组非常相似

type_t arr_name[row][col];
  • type_t是指元素的类型;
  • arr_name是数组名;
  • row是一个常量表达式,用来指定数组的行数;
  • col是一个常量表达式,用来指定数组的列数;

用法示例

int arr[3][4];//创建一个3行4列的整形二维数组
char arr1[3][5];//创建一个3行5列的字符二维数组
double arr3[2][4];//创建一个2行4列的浮点型二维数组

二维数组的初始化

//数组初始化
int arr[3][4] = {1,2,3,4};//将第一行赋值1,2,3,4,其余行的数默认为0;
//表示第1行{1,2},第2行{4,5}
//最终效果:
//1 2 0 0
//4 5 0 0
//0 0 0 0
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略
  • 数组的不完全初始化,其他内容默认为0
  • 二维数组初始化时,行可以省略,列不能省略

二维数组的使用

二维数组的访问用 数组名[行][列] 的形式

用法示例

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

二维数组的存储

像之前一样,通过打印各个元素的地址来观察一下:

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

第五章 数组,C语言初阶知识,java,开发语言
通过观察发现:

  • 二维数组每行元素里相邻元素地址相差4,刚好为一个int类型大小
  • 每行最后一个元素与下一行第一个元素地址也相差4
    由此可见,二维数组和一维数组一样,在内存中也是连续存储的。

数组的越界访问

我们在创建数组时候,都知道下标是由范围限制的。

  • 数组的下标规定是从0开始,如果数组由n个数组组成,那么元素的下标范围就是0到-1
  • 所以当数组的下标小于0或者大于n-1,就是数组越界访问,超出了数组合法空间的访问

注意:C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。

数组越界的例子

#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\n", arr[i]);//当i等于10的时候,越界访问
	return 0;
}

数组越界访问,我们无法知道越界访问的空间是否存在危险,也无法预料产生的其他后果。

数组作为函数参数

  • 通常情况下,数组名是首元素地址
  • sizeof(数组名):计算的是整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组
  • &数组名:取出的是数组的地址,&数组名,数组名表示整个数组
#include<stdio.h>
int main()
{
	int arr[5] = { 0,1,2,3,4 };
	printf("  arr=%p\n", arr);
	printf("arr+1=%p\n", arr + 1);
	printf("\n");
	printf("  &arr[0]=%p\n", &arr[0]);
	printf("&arr[0]+1=%p\n", &arr[0] + 1);
	printf("\n");
	printf("  &arr=%p\n", &arr);
	printf("&arr+1=%p\n", &arr + 1);
	return 0;
}

第五章 数组,C语言初阶知识,java,开发语言

冒泡排序

适用条件:整型数组进行升序排序

用法示例

错误示例

#include <stdio.h>
void bubble_sort(int arr[])
{
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 5,3,7,6,1,8,9,2,4,0 };
	bubble_sort(arr);
    int i = 0;
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

这段代码星相信很多小伙伴看不出什么问题,但是运行结果时却是错误的,原因就在于sizeof(arr)计算的是数组的大小,而将arr传递进函数内部时,arr就不再时一个数组,而是一个地址,也就是数组首地址,所以我们用sizeof计算一个地址大小时,会产生很大的误差。

正确示例文章来源地址https://www.toymoban.com/news/detail-613132.html

#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 5,3,7,6,1,8,9,2,4,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	bubble_sort(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

到了这里,关于第五章 数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 王道考研计算机网络第五章知识点汇总

    5.1.1 传输层概述 复用:好比家里面每个人都要写信,向信箱里面投入信件,然后由邮递员取走。 分用:就是每个人都收到了各自的回信,然后从信箱中取走各自的信  5.2 UDP协议  注意:用户数据报和检验和都是指的整个UDP数据报 5.3.1 TCP协议特点和TCP报文段        11,12,

    2024年02月13日
    浏览(43)
  • 【计算机网络】第五章传输层知识点及经典例题汇总

    1、从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层 2、此层包含TCP和UDP协议。TCP 传送的数据单位协议是 TCP 报文段(segment),UDP 传送的数据单位协议是 UDP 报文或用户数据报。 3、IP数据报要经过

    2024年02月04日
    浏览(47)
  • 自然语言处理: 第五章Attention注意力机制

    Attention(来自2017年google发表的[1706.03762] Attention Is All You Need (arxiv.org) ),顾名思义是注意力机制,字面意思就是你所关注的东西,比如我们看到一个非常非常的故事的时候,但是其实我们一般能用5W2H就能很好的归纳这个故事,所以我们在复述或者归纳一段文字的时候,我们

    2024年02月17日
    浏览(36)
  • 谭浩强【C语言程序设计】第五章习题详解

    目录 1.请画出例5.6 中给出的 3个程序段的流程图。 2.请补充例5.7程序,分别统计当“fabs(t)=1e-6”和“fabs(t)=1e-8”时执行循环体的次数。 3.输入两个正整数m 和n,求其最大公约数和最小公倍数。 4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 5. 求S

    2024年01月23日
    浏览(55)
  • JAVA学习笔记——第五章 控制结构

    🔥 博客主页 : A_SHOWY 🎥 系列专栏 :力扣刷题总结录 数据结构  云计算  数字图像处理  力扣每日一题_  流程控制总体介绍:决定程序是如何执行的,主要包括顺序控制、分支控制和循环控制 顺序控制:程序从上到下逐行执行,没有任何判断跳转 一个变量必须要先定

    2024年01月23日
    浏览(42)
  • java核心技术卷1 第五章:继承

    一个继承另一个类,父类也称为超类,基类。\\\"超类\\\"中的超来自于集合理论,指的是父类,与之后的super对应 java中,类的继承默认为public继承(只有公共继承),与c++不同。 子类public继承父类,所以继承到的字段和方法的访问权限都不变,和c++同,子类中无法直接访问父

    2024年03月17日
    浏览(49)
  • 【JavaWeb后端开发-第五章(2)】Mybatis 进阶学习

    学习完mybatis入门后,我们继续学习mybatis基础操作。 需求说明:     根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询     根据主键ID查询     条件查询 新增

    2024年02月01日
    浏览(48)
  • 第五章认识Node.js服务器开发

    目录 认识服务器开发 基本概念 基本作用 基本优势 基本组成 Node.js网站服务器 基本概述 基本步骤 基本特点 认识HTTP协议 基本概述 HTTP的请求消息和响应消息 请求消息 响应消息 HTTP请求处理与响应处理 GET请求参数 POST请求参数 路由 静态资源访问 认识服务器开发 基本概念 服

    2024年02月07日
    浏览(48)
  • 数据结构(c++语言版) 邓俊辉 第五章:二叉树学习笔记

    5.1二叉树及其表示         树是由节点和边组成的。 1.有根树         树是由顶点(vertex)和边(edge)组成。树的每个顶点也叫节点(node)。 2.深度与层次         由树的连通性,每一节点与根都有一条路径相连:根据树的无环性,由根通往每个节点的路径必然唯一。  

    2024年02月13日
    浏览(44)
  • 《python语言程序设计基础》(第二版)第五章课后习题参考答案

    第五章 函数和代码的复用 5.1 改造练习题3.5,输出更大的田字格 5.2 实现isOdd函数 5.3 实现isNum函数 5.4 实现multi函数 5.5 实现isPrime函数 5.6 输出10种生日日期格式 代码一: 代码二: 5.7 汉诺塔 注:上述代码仅供参考,若有问题可在评论区留言!

    2024年02月01日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包