首页 > 其他分享 >【C语言】详解数组

【C语言】详解数组

时间:2024-09-05 08:52:07浏览次数:13  
标签:初始化 arr int 元素 C语言 二维 详解 数组

文章目录


前言

一、数组的概念(数组是一组相同类型元素的集合)
二~三、一维数组和二维数组的创建和初始化,以及如何使用数组下标访问和使用数组,还讨论了一维数组和二维数组在内存中是如何存储的


一、数组的概念

数组是一组相同类型元素的集合,展开来讲就是:
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
• 数组中存放的多个数据,类型是相同的。

数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

二、一维数组

1.一维数组的创建

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

type arr_name[常量值];

存放在数组中的数据被称为数组的元素,数组在创建的时候要指定数组的大小和数组的元素类型。
• type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型。
• arr_name 指的是数组的名字,这个名字根据实际情况,起的有意义就行。
• [ ] 中的常量值是用来指定数组的大小的,这个数组的大小根据实际的需求指定就行。

我们可以根据需要创建不同类型和大小的数组:

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

2.一维数组的初始化

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

(1)完全初始化:在定义数组时对全部数组元素赋予初值
    int arr[5] = {1,2,3,4,5}; 

(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
    int arr[5] = {1,2}; //前两个元素初始化为1和2,剩余的元素默认初始化为0
    char ch[5] = {'a','b'}; //前两个元素初始化为'a'和'b',剩余的元素默认初始化为'\0'

(3)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
                int arr[5] = {1,2,3,4,5}; 
     也可以写成:int arr[] = {1,2,3,4,5};  
     //虽然没有在方括号中指定数组的大小,但是系统会根据花括号中数据的个数来确定数组的大小

3. 一维数组的使用

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

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

在这里插入图片描述

在C语言中数组的访问提供了⼀个操作符 [ ] ,这个操作符叫:下标引用操作符。
有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为7的元素,我们就可以使用 arr[7] ,想要访问下标是3的元素,就可以使用 arr[3]
。如下代码:

#include <stdio.h>

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

在这里插入图片描述

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

在这里插入图片描述
从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的
在这里插入图片描述

三、二维数组

1.二维数组的创建

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

type arr_name[常量值1][常量值2];

举例说明:

int arr[3][5];

• 3表示数组有3行
• 5表示每⼀行有5个元素
• int 表示数组中的每个元素是整型类型

2. 二维数组的初始化

在创建数组的时候,给定⼀些初始值,被称为数组初始化。
那二维数组如何初始化呢?像一维数组一样,也是使用大括号初始化的。

(1)完全初始化:在定义数组时对全部数组元素赋予初值
    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},{2,3,4,5,6},{3,4,5,6,7}}; //也可以将数据放在几个花括号内分行来对数组进行初始化

在这里插入图片描述

(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
    int arr1[3][5] = {1,2,3,4,5,6}; //前6个元素初始化为1~6,剩余的元素默认初始化为0
    int arr2[3][5] = {{1,2},{3,4},{5,6}}; //初始化了每一行的前两个元素,每一行剩余的元素默认初始化为0

在这里插入图片描述

(3)在对二维数组元素赋初值时,可以省略行数,但不能省略列数(每一行的元素个数)。如下:
   int arr1[][5] = {1,2,3,4,5,6};
   int arr2[][5] = {1,2,3,4,5,6,7,8,9,10,11};
   //系统会根据赋初值的元素个数和列数来确定二维数组的行数

在这里插入图片描述

3. 二维数组的使用

其实二维数组访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯⼀锁定数组中的⼀个元素。
C语言规定,二维数组的行是从0开始的,列也是从0开始的,如下所示:

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

在这里插入图片描述

行号和列号都是从0开始的,只要确定了行和列就能唯⼀锁定数组中的⼀个元素,比如,我们说:第0行,第0列,快速就能定位出1;第2行,第4列,就能定位出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[0][0]);//1
	printf("%d\n", arr[2][4]);//7
	return 0;
}

在这里插入图片描述

4.二维数组在内存中的存储

像⼀维数组⼀样,我们如果想研究二维数组在内存中的存储方式,也是可以打印出数组所有元素的地址的。代码如下:

#include <stdio.h>

int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
	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个字节,所以二维数组中的每个元素都是连续存放的
如下图所示:

在这里插入图片描述


标签:初始化,arr,int,元素,C语言,二维,详解,数组
From: https://blog.csdn.net/2302_76713442/article/details/141758194

相关文章

  • java数组
    数组:是一种容器,可以用来储存同种数据类型的多个值注:数组容器子在存储数据的时候,需要结合隐式转换考虑,数组类型和存储的数据类型需保持一致。初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器的过程地址值:数组的地址值就表示数组在内存中的位置double[]arr1={11,12......
  • Linkedlist源码详解
    介绍LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,......
  • java基础知识-JVM知识详解
    一、JVM内存结构Java虚拟机(JVM)的内存结构主要分为几个不同的区域,每个区域都有其特定的目的和功能。以下是JVM内存结构的主要组成部分:先看一下总体的结构图程序计数器(ProgramCounterRegister)这是一个较小的内存块,用于存储当前线程所执行的字节码指令的地址。每......
  • 在线OJ项目详解
    一、项目准备工作1、什么是在线OJOnlineJudge系统(简称OJ)是一个在线的判题系统。用户可以在线提交程序源代码,系统对源代码进行编译和执行,并通过预先设计的测试用例来检验程序源代码的正确性。2、所用技术C++STL标准库。cpp-httplib第三方开源网络库。ctemplate第三方开源前端网页......
  • C语言程序设计(初识C语言后部分)
    十九,指针1)指针是什么?指针理解的2个要点:1,指针是内存中一个最小单元的编号,也就是地址2,平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量总结:指针就是地址,口语中说的指针通常指的是指针变量。指针变量:我们可以通过&(取地址操作符)取出变量的内存起始地址,把......
  • C语言程序设计-练习篇
    少年自当扶摇上,揽星衔月逐日光。一,小乐乐走台阶描述:小乐乐上课需要走n阶台阶,因为腿长,所以每次可以选择走一阶或者两阶,那么他一共有多少种走法?输入描述:输入包含一个整数n(1<=n<=30)输出描述:输出一个整数,即小乐乐可以走的方法数#include<stdio.h>//小乐乐走台阶intf......
  • 删除有序数组中的重复项 II
    给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。示例1:输入:nums=[1,1,1,2,2,3]输出:5,nums=[1,1,2,2,3]解释:......
  • Linkedlist源码详解
    介绍LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类......
  • 用C语言生成字符贪吃蛇游戏
    用C语言生成字符贪吃蛇游戏1.引言贪吃蛇是一个经典的小游戏,玩家通过控制蛇的移动来吃食物,随着食物的增加,蛇的长度也会增加,游戏的难度逐渐提升。本文将介绍如何使用C语言来实现一个简单的字符贪吃蛇游戏。2.环境准备在开始编码之前,需要确认以下开发环境:编译器:支持......
  • C语言练习:扫雷游戏(排除了一些bug,放心食用!)
    游戏规则只有雷被全部排查出来,游戏结束。每当排查一个坐标,如果不是雷,此坐标上就会显示周围一圈上有几个雷。 游戏实现代码讲解开始前的准备首先我们假定一个9*9的棋盘格展示在玩家面前(如下图所示,坐标从0开始)但是对于玩家来说,第一个编号是从0开始的不太习惯,所以我们要在......