c语言之“数组”初级篇

news2024/11/26 21:27:32

前言

牛牛又和大家见面了,本篇牛牛要讲的内容是c语言中有关数组的内容。

欢迎大家一起学习,共同进步。

目录

  • 前言
  • 数组
  • 一、一维数组
    • 1.1 一维数组的创建
    • 1.2 一维数组的初始化
    • 1.3 一维数组的应用
    • 1.4 一维数组的存储
  • 二、二维数组
    • 2.1 二维数组创建
    • 2.2 二维数组的初始化
    • 2.3 二维数组的应用
    • 2.4 二维数组的存储
  • 三、数组越界

数组

通过前面所学到的知识,我们了解到,当我们需要使用一些变量的时候,我们可以通过创建变量来使用它,但是,有的时候我们需要使用很多个同类型的变量,那样一个个创建是否显得太过繁琐?
其实
数组就是一组相同类型元素的集合。 我们只要创建一个类型的数组,就可以同时创建很多相同类型的变量。

一、一维数组

1.1 一维数组的创建

格式:

数据类型 数组名 [常量表达式]
int arr [5];

常量表达式:决定创建的数组的大小(即可以存储多少个相同类型的数据)
注意:数组创建,在C99标准之前, []里面 必须是常量才行,不能使用变量。在C99标准支持了变长数组的概念之后,数组的大小可以使用变量指定,但是数组不能初始化。(vs2019并不支持C99标准)
举例:
可能出错代码:

	int a = 10;
	int arr[a];

由于在vs2019环境下并不支持C99标准,所以这里使用变量,编译器是会报错的。

正确代码:

int arr[10];//创建一个可以存储10个整形变量的数组。
char arr[10];//创建一个可以存储10个字符类型的数组

1.2 一维数组的初始化

数组已经创建好了,怎样将我们需要创建的变量放进去呢?
我们在创建数组的同时,可以给数组赋予一些合理初始值(初始化)。

	//创建一个可以存储10个整形数组的整形数组,并将它的前5个元素分别赋值为1,2,3,4,5,剩余元素则默认为0;
	int arr1[10] = { 1,2,3,4,5 };
	//这里[]为空的时候表示:根据后面初始化的元素个数,来自动设置大小
	int arr2[] = { 1,2,3,4 };//自动设置为4个大小,等价于arr2[4]={1,2,3,4}
	int arr3[5] = { 1,2,3,4,5 };//表示完全初始化,即每个元素都被赋予了初始值。
	//定义字符型数组,可以存储3个字符,98如果按字符打印会自动转化为对应的ASCII码表对应的字符
	char arr4[3] = { 'a',98, 'c' };

1.3 一维数组的应用

我们首先介绍介绍一个操作符: [] (下标引用操作符), 数组元素的下标是从0开始的,即arr[5]数组的首元素是arr[0];

题目:从键盘输入10个数,并将他们打印在屏幕上。

#include <stdio.h>
int main()
{
    int arr[10] = { 0 };//数组的不完全初始化
       //计算数组的元素个数
    int sz = sizeof(arr) / sizeof(arr[0]);
    //对数组内容赋值,数组是使用下标来访问的,下标从0开始。
    int i = 0;
    printf("请输入:10个数。");
    for (i = 0; i < 10; i++)//从键盘输入10个数字赋值给数组arr[0]到arr[9]
    {
      scanf("%d",&arr[i]);//这里记得&,新手总是忘记
    }
    //输出数组的内容
    for (i = 0; i < 10; ++i)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

代码中 sizeof(arr)表示计算整个数组arr的大小,而sizeof(arr[0])表示计算数组中首元素的大小(随便计算一个元素就行,因为每个元素的大小都是相等的,这里是选取了首元素)。

补充小知识:

1.sizeof:c语言中的一个关键字,也是一种操作符。是用于计算数据在内存中所占的字节数。

1.4 一维数组的存储

数组在内存中是怎样存储的呢?

#include <stdio.h>
int main()
{
 	int arr[5] = {0};//定义一个可以存储5个元素的整形数组
	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是打印地址的格式输出符号。

运行结果:
注意:每次运行的时候打印的结果会不一样,因为变量的创建会 重新分配地址。

从图中结果我们知道,随着数组下标的增长,元素的地址是在有规律的递增(每个元素之间差四个字节)。
所以我们知道,数组在内存中是连续存放的。

每个元素之间差4个字节是因为整形int(vs2019环境下)占四个字节,所以一个元素存储要分配四个字节

重点介绍以下两个数组

	char arr5[] = "abcdef";//数组1
	char arr6[] = { 'a','b','c','d','e','f'}; //数组2

这两个数组等价吗?长度一样吗?试着猜一下下面代码运行的结果:

补充小知识:

strlen:C 语言中的库函数中的一种,用于计算字符串的长度,直到遇到结束字符(‘\0’),但不包括空格字符。
需要引用的头文件是:#include <string.h>

#include <stdio.h>
int main()
{
	char arr5[] = "abcdef";//数组1
	char arr6[] = { 'a','b','c','d','e','f'}; //数组2
	printf("数组arr5的大小为是 %d\n", sizeof(arr5));//语句1
	printf("数组arr6的大小为是 %d\n", sizeof(arr6));//语句2
	printf("数组arr5的长度是 %d\n", strlen(arr5));//语句3
	printf("数组arr6的长度是 %d\n", strlen(arr6));//语句4
	return 0;
}

运行结果:

原因分析:
语句1:值为7是因为字符串“abcdef”在 存储的时候会自动在末尾加上’\0‘,所以sizeof也计算了字符’\0‘。

语句2:值为6是因为数组2只有6个元素,后面并没有’\0‘;

语句3:值为6是因为“abcdef\0”,strlen函数遇到’\0’就结束了,只计算’\0’前面的字符串长度。

语句4:由于一维数组在内存中是连续存放的,char arr6[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};后面并不会默认加上’\0‘所以strlen会继续往后找,直到遇到’\0‘,所以会打印 随机值。

二、二维数组

2.1 二维数组创建

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

2.2 二维数组的初始化

//数组初始化
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}};//二维数组如果有初始化,行可以省略,列不能省略

注意:二维数组如果有初始化,行可以省略,列不能省略。
因为你不告诉列数,计算机不知道什么时候换行,但是行数不知道的情况下,只要达到列数的最大值就会自动换行,一直往下走就行。

2.3 二维数组的应用

二维数组的访问时用arr[行号] [列标]的形式,与一维数组一样都是从0开始。

计算3阶行列式的值:
代码:

#include <stdio.h>
int main()
{
	int arr1[3][3];//创建一个三行三列的二维数组
	int i = 0;
	printf("请输入行列式:\n");
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 3; j++)
		{
			scanf("%d", &arr1[i][j]);//从键盘的到行列式的值
		}
	}
	int sum1 = 0;//主对角线的三个数的积与和主对角线平行的对角线上的三个数的积的和
	int sum2 = 0;//次对角线的三个数的积与和次对角线平行的对角线上三个数的积的和
	int sum = 0;//行列式的值
	sum1 = arr1[0][0] * arr1[1][1] * arr1[2][2] + arr1[1][0] * arr1[2][1] * arr1[0][2] + arr1[2][0] * arr1[0][1] * arr1[1][2];
	sum2 = arr1[0][2] * arr1[1][1] * arr1[2][0] + arr1[0][1] * arr1[1][0] * arr1[2][2] + arr1[0][0] * arr1[1][2] * arr1[2][1];
	sum = sum1 - sum2;
	printf("该三阶方阵的值是%d", sum);
	return 0;
}

2.4 二维数组的存储

我们试着和一维数组一样,通过打印个元素的地址观察一下:


#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;
}

运行结果:

由此可见,二维数组和一维数组一样,在内存中也是连续存储的。

三、数组越界

我们知道数组的下标是有范围限制的。
比如:如果数组有n个元素,那么元素的下标范围是0到n-1;
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
注意:C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。
建议我们在使用数组的时候要注意检查,数组是否越界。
数组越界的例子:

#include <stdio.h>
int main()
{
	int arr[10];
	int i = 0;
	for (i = 0; i <= 10; i++)//当i=10的时候,arr[10]则数组越界了。
	{
		arr[i] = i;
		printf("%d ", arr[i]);
	}
	return 0;
}

好了,今天c语言中有关数组的知识就牛牛讲到这里了。
最后,小伙伴们的点赞就是给牛牛最大的支持,能不能给牛牛来一个一键三连呢?谢谢支持。

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

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

相关文章

MySQL的select语句

SQL概述 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的已经几幕兴衰。但在这片浩荡的波…

基于android的车辆违章停放执法移动APP(ssm+uinapp+Mysql)-计算机毕业设计

车辆违章停放执法移动APP的功能已基本实现&#xff0c;主要实现首页&#xff0c;个人中心&#xff0c;市民管理&#xff0c;警察管理&#xff0c;罚单信息管理&#xff0c;缴费通知管理&#xff0c;系统管理等功能的操作系统。 论文主要从系统的分析与设计、数据库设计和系统的…

【机器学习】回归的原理学习与葡萄酒数据集的最小二乘法线性回归实例

文章目录一&#xff0c;回归1.1回归分析的基本概念1.2线性回归1.3最小二乘法1.4一元(简单)线性回归模型1.4.1随机误差项(线性回归模型)的假定条件1.4.2参数的普通最小二乘估计(0LS)1.5葡萄酒数据集的最小二乘法线性回归实例一&#xff0c;回归 1.1回归分析的基本概念 回归分析…

前端一面经典vue面试题总结

一般在哪个生命周期请求异步数据 我们可以在钩子函数 created、beforeMount、mounted 中进行调用&#xff0c;因为在这三个钩子函数中&#xff0c;data 已经创建&#xff0c;可以将服务端端返回的数据进行赋值。 ​ 推荐在 created 钩子函数中调用异步请求&#xff0c;因为在…

受激拉曼散射计量【Stimulated-Raman-Scattering Metrology】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

单元测试的时候读不到resources.test中配置

背景 接手了几个老工程&#xff0c;跑单元测试的时候&#xff0c;发现数据库的配置总是走了dev环境&#xff0c; 原因是工程中分环境进行了db的配置 历史经验 指定本地环境 ActiveProfiles(“test”) 没有生效 解决 在pom文件中 新加如下配置 <build><!--单元测…

Java—类加载机制

类加载机制 我们多次提到了类加载器ClassLoader&#xff0c;本章就来详细讨论Java中的类加载机制与ClassLoader。 类加载器ClassLoader就是加载其他类的类&#xff0c;它负责将字节码文件加载到内存&#xff0c;创建Class对象。与之前介绍的反射、注解和动态代理一样&#xf…

奶制品数据可视化,去年全国奶制品产量高达3778万吨,同比增长7.1%

奶制品是生活中很常见的一种补充人体所需维生素和矿物质元素的重要食品&#xff0c;在生活中奶制品也是很常见的&#xff0c;食用最多的是牛奶。牛奶中含有非常丰富的钙质&#xff0c;睡前适当给孩子食用&#xff0c;可以补充孩子所需的钙质从而达到长高的效果。 很多小伙伴经常…

C++ 类和对象以及内存管理 练习错题总结

作者&#xff1a;小萌新 专栏&#xff1a;C初阶作业 简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客介绍&#xff1a;对于我们上一周学的知识做一个总结 查缺补漏 C 类和对象以及内存管理练习类和对象 (上)拷贝构造函数类和对象&#xff08;中&#xff09;重载函数运…

MySQL 主从复制与读写分离

一 概念 什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) &#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要读写分离 因为数据库的“写…

刷题笔记之九(查找输入整数二进制中1的个数+完全数计算+杨辉三角的变形+计算某字符出现次数)

目录 1. 聚合查询是进行行与行的运算合并&#xff0c;是不能和别的列放在一块查询 2. PHP数据库查询语句 3. 有group by时先执行where&#xff0c;后执行having 4. join常用两张表内连接和外连接&#xff0c;用一张表可以自连接 5. 删除数据用delete&#xff0c;删除表时…

python基于PHP+MySQL汽车展览会系统

随着我国交通事业的发展,汽车已经逐渐的成为了人们主要的代步工具之一,但是如何从众多品牌和型号的车海中选择最适合自己的那款车是很多购车人士一直以来关系的问题。为了方便车主更好的选择自己的车辆很多汽车经销商会不定期的举办一些车展来展销自己的车辆,同时也给购车用户提…

2022 “行业寒冬”,给在座的测试人一些涨薪建议

10 月 24 日&#xff0c;Python 官方发布了最新的 3.11 版本&#xff0c;新的版本速度提升2倍&#xff0c;以弥补与其他编程语言在速度上的缺陷。可以预见Python语言在未来的应用范围会越来越广。 会Python语言能细分出许多从业方向&#xff0c;其中随着互联网的发展&#xff…

Python_Numpy库的ndarray对象的属性有哪些?如何获取它们的值?

Python_Numpy库的ndarray对象的属性有哪些?如何获取它们的值? Python_Numpy库的ndarray对象的常用属性有如下这些&#xff1a; ndim—矩阵的维度&#xff1b; shape—矩阵的形状&#xff1b; size—矩阵的元素个数&#xff1b; dtype—矩阵元素的数据类型&#xff1b; T-矩阵…

【Transformers】第 1 章 :Hello Transformers

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Stream流总结

前言 在Java中&#xff0c;涉及到对数组、Collecction等集合类中的元素进行操作的时候&#xff0c;通常会通过循环的方式进行逐个处理&#xff0c;或者使用Stream流的方式进行处理 例子 从给定句子中返回单词长度大于5的单词列表&#xff0c;按长度倒序输出&#xff0c;最多返…

算法入门 | 分治策略

目录 分治策略 1.分治法可以解决的问题特征 2.分治法解题步骤 3.分治法编程举例 递归求阶乘 求斐波那契数列 小练习&#xff1a;给出一个数n&#xff0c;打印其每一位 分治策略 1.分治法可以解决的问题特征 &#xff08;1&#xff09;问题规模缩小到一定程度就可以轻易…

什么是HTML?

关于每篇博文的浪漫主义 【4k】镰仓的灰色与青 | irkyar | sonya74【【4k】镰仓的灰色与青 | irkyar | sonya74】 https://www.bilibili.com/video/BV14G411A7eX/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 网页 1.1什么是网页 网站是指在因特网…

重磅干货:多维度深入总结MySQL锁机制

一. 前言 有过面试经历的小伙伴都知道&#xff0c;现在面试Java开发工作&#xff0c;数据库几乎是你绕不过去的一道坎。就以文哥班上的学员为例&#xff0c;几乎每个学员的每场面试都会被问到数据库的问题。文哥很用心地给大家总结了一下&#xff0c;数据库基本都是从以下几个…

基于变化点 copula 优化算法中的贝叶斯研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…