首页 > 其他分享 >C语言-----数组

C语言-----数组

时间:2024-06-07 23:30:40浏览次数:21  
标签:初始化 arr int 元素 C语言 二维 ----- 数组

简单了解数组的知识以及数组的运用

一、数组的概念

    数组可以说是目前为止学到的第一个真正意义上存储数据的结构。虽然前面学习的变量也能存储数据,但变量所能存储的数据很有限。
    那么到底什么是数组呢?顾名思义数组就是很多数的组合!那么这些数有没有什么要求呢,是不是不管什么数组合在一起都是数组呢?同一数组中存储的数必须满足以下两个条件:
    1.这些数的类型必须相同。
    2.这些数在内存中必须是连续存储的。
    3.数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

换句话说,数组是在内存中连续存储的具有相同类型的一组数据的集合。

二、一维数组

1. 一维数组的创建与初始化


    1.1 一维数组创建的基本语法如下:

type name[常量值] = { 0 };

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。

  • type指定的是数组存放数据的类型,如char、int、float等,当然也可以是自定义类型。
  • name指定的是所创建的数组的名字(可根据实际情况起名字,尽量要起得有意义)。
  • 常量值指定的是数组的大小,这个数组的大小是根据实际的需求指定就行。
  • { }内的是数组的元素,根据编程所需写入相应的数据。

比如:存入一个班级20人的身高,我们就可以创建一个数组:

float height[20];

当然我们也可以创建其他类型的数组存其他数据:

 char ch[8];
 double score[10];
 unsigned age[20];

    1.2 一维数组的初始化:
    有时候,数组在创建的时候,我们需要给定一些初始值,这种就称为初始化的。
那数组如何初始化呢?数组的初始化一般使用大括号,将数据放在大括号中。
    数组的初始化分为两种,分别是

1.完全初始化
2.不完全初始化

 //完全初始化
 
int arr[5] = {1,2,3,4,5};
 //不完全初始化
 
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0 
//错误的初始化 - 初始化项太多

 int arr3[3] = {1, 2, 3, 4};
2. 一维数组的使用

    学习了一维数组的基本语法,⼀维数组可以存放数据,存放数据的目的是对数据操作,那我们如何使用一维数组呢?下面我们来学习如何使用一维数组:

    2.1 数组的下标:

    C语言规定数组是有下标的,数组的每个元素都有自己相应的下标,下标就相当于数组元素的编号,下标从0开始,假设数组有n个元素,最后一个元素的下标是n-1,如下:

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

在这里插入图片描述
在C语言中的数组访问中提供了一个操作符[ ],叫作下标引用操作符
    有了下标引用操作符,我们就可以更容易地去访问对应的元素了。比如我们想访问元素3的时候,就可以使用arr[2],想要访问元素5的时候,就可以使用arr[4]。如以下代码:
在这里插入图片描述

    2.2 数组元素的打印:

    我们已经知道数组的下标可以用来指定数组的元素,那么我们该如何访问整个数组的所有元素呢?
    我们知道,数组的下标是连续的,那么这个时候就可以用我们前面所学习的for循环来实现数组下标的输入,最后访问整个数组的元素,代码如下:

#include<stdio.h>
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);//利用for循环依次输入数组元素的下标
	}
	return 0;
}

程序运行结果:
    在这里插入图片描述

    2.3 数组的输入:

明白了数组的访问,当然我们也根据需求,自己给数组输入想要的数据,代码如下:

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

输入和输出的结果:
在这里插入图片描述

三、二维数组

1. 二维数组的创建与初始化

    1.1 二维数组创建的基本语法如下:

type name[常量值1][常量值2] = { 0 };
//例如:
int arr[3][5];

二维数组的语法与一维数组的基本一致,不同的地方就是维度,一维数组只有一行,而二维数组既有行也有列。二维数组也可以看作是由一维数组组成的数组,三维数组也可以看作是由二维数组组成的数组…

语法解析:

  • 3表示数组有3行
  • 5表示每⼀行有5个元素
  • int表示数组的每个元素是整型类型
  • arr是数组名,可以根据自己的需要指定名字

     1.2 二维数组的初始化:

二维数组的初始化方法与一维数组的基本一致,都是在大括号内的,但由于维度不同,所以在初始化的形式上也会有些许不同。

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

在这里插入图片描述

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

在这里插入图片描述
另外,还有其他的初始化方式,就是按照行初始化,例如:

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

这样也属于不完全初始化,但是每一行都有两个元素,{1,2}在数组的第0行,{3,4}在数组的第1行…
初始化时可以省略行,但是不能省略列: int arr[ ][5] 。

2. 二维数组的使用

     二维数组的输入和输出:

    访问数组的单个元素我们在上面一维数组那已经知道如何去操作了,其实访问二维数组的方法亦是如此,那我们该如何去访问整个二维数组呢?
    其实方法很简单,我们只要能够按照一定的规律产生所有的行和列的数字就行;以上⼀段代码中的arr数组为例,行的选择范围是0-2,列的取值范围是0-4,所以我们可以借助循环实现生成所有的下标:

#include <stdio.h>
int main()
{
	int arr[3][5];
	int i = 0;//遍历⾏
	//输⼊
	for (i = 0; i < 3; i++) //产⽣⾏号
	{
		int j = 0;
		for (j = 0; j < 5; j++) //产⽣列号
		{
			scanf_s("%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;
}

输入和输出的结果:
在这里插入图片描述
关于二维数组的知识就讲到这了,接下来就开始讲解如何计算数组的大小。

四、用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,即这个数组有10个元素
    以后在代码中需要数组元素个数的地方就不用固定写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了。

好了,对数组的讲解就到这了,如果喜欢我的博客就请给个免费的小红心吧,下一篇博客再见!

标签:初始化,arr,int,元素,C语言,二维,-----,数组
From: https://blog.csdn.net/2402_83215991/article/details/139197896

相关文章

  • element-ui el-table表格固定表头代码示例
    在使用element-ui的el-table组件时,固定表头是一个常见的需求,特别是当表格内容较多时。以下是固定表头的一个基本示例代码:<template><el-table:data="tableData"style="width:100%"height="300px"><el-table-columnprop="date"label="日期"......
  • 网络原理-计算机网络详解-网线传递数字信号的原理
    网络原理-计算机网络详解-网线传递数字信号的原理家用的网线:传递的数字信号,原理是:(1)和电线传输电的原理一样,只不过网线上传输的就是脉冲电信号,而且遵守一定的电器规则。(2)计算机上的数据都是用0和1来保存的,所以在网线上传输时就要用一个电压表示数据0,用另一个电压表示数据1。(3)网......
  • c语言基础问题:1瓶汽水1元,2个空瓶可以换一瓶汽水,20元可以喝多少瓶汽水?
    老师布置的小组作业,好像是曾经的蓝桥杯题目,自己琢磨一下写出来了,写都写了还都加了注释,就想着不如发到这上面了,有遇到类似问题的可以看看,代码比较笨但是很好理解。#include<stdio.h>intmain()//1瓶汽水1元,2个空瓶可以换一瓶汽水,20元可以喝多少瓶汽水?{ intyuan=20;//本金......
  • summer-data介绍
    官网地址:https://www.summer-data.com代码库地址:https://gitee.com/hahan2020/summer-datasummer-data是什么?summer-data设计用于替代mybatis和hibernate。从个人角度挑一些它们和springjdbc-template的缺点,这些缺点是我创作summer-data的原因。mybatis需......
  • node和node-gyp 版本不一致
    背景:导入Vue的环境时,需要执行命令:npminstall,出现node和node-gyp版本不一致报错信息如下npmerrorgypERR!node-vv20.13.1npmerrorgypERR!node-gyp-vv3.8.0npmerrorgypERR!notoknpmerrorBuildfailedwitherrorcode:1npmerrorAcompletelogofthis......
  • Dragon_Knight_CTF-stack(栈迁移)
    Dragon_Knight_CTF-stack(栈迁移)程序的保护情况如下,可以看到没有开启pie保护Arch:amd64-64-littleRELRO:PartialRELROStack:NocanaryfoundNX:NXenabledPIE:NoPIE(0x3fe000)可以看道main函数也很简洁,只有一个0x10大小的溢出,程序给了libc,版......
  • FRDM-MCXN947开发板之i2c应用
    介绍MCXN947NXPFRDM-MCXN947开发板是一款基于MCXN947MCU的低成本评估板,MCU集成了双核ArmCortex-M33微控制器和一个神经处理单元(NPU)。开发板由一个MCXN947控制器和一个64Mbit外部串行闪存组成。该板还具有P3T1755DPI3C温度传感器,TJA1057GTK/3ZCANPHY,以太网PHY,SDHC电路......
  • atcoder ABC 353-A题详解
    atcoderABC353-A题详解ProblemStatementThereareNbuildingsalignedinarow.Thei-thbuildingfromthelefthasaheightofHi.Determineifthereisabuildingtallerthanthefirstonefromtheleft.Ifsuchabuildingexists,findtheposition......
  • 最大公约数(gcd())和最小公倍数(lcm())的c语言和c++详细解法
    最大公约数(gcd())和最小公倍数(lcm())最大公约数:定义:两个或多个整数共有的约数中最大的一个。例如:整数12和18,他们的公约数有1、2、3、6,其中最大的公约数是6。c语言解法:辗转相除法和更相减损法1、辗转相除法:思路:先求解较大的数除以较小的数的余数,再用较小的数除以前......
  • Linux下的C语言编程(指针)
    目录1一级指针1.1定义1.2指针的内存大小1.3指针的偏移1.3.1加法偏移1.3.2减法偏移2二级指针2.1定义2.2如何理解二级指针3三级指针3.1定义4数组和指针的关系4.1一维数组与指针的关系4.1.1数组名的性质4.1.2数组名与指针的地址偏移4.2二维数组与......