首页 > 其他分享 >【C语言】数组(一维、二维数组的简单介绍)

【C语言】数组(一维、二维数组的简单介绍)

时间:2024-03-27 09:00:30浏览次数:17  
标签:初始化 下标 数组 nums int 元素 C语言 一维

数组(Array)

请添加图片描述

数组概念

数组是一组相同数据类型元素的集合,属于一种简单的数据结构,从中可以得到三个有效信息

  • 数组元素是同一数据类型的变量
  • 数组存放一个或者多个数据,但是数组元素个数不能为0
  • 数组中各元素可独立作为一个基本变量使用

注:数组分为一维数组和多维数组,多维数组一般是二维数组作为使用

请添加图片描述

一维数组

语法:

typed(类型说明符)  arr_name(数组名)[size(常量值)]
 例如:int nums[10];
  • 存放在数组的值被称为数组的元素,创建数组可以指向数组大小和数组的元素类型
  • 其中,[]下标引用操作符中size是用于指定数组的大小,也是数组元素的个数

一维数组的初始化

规定:数据放在大括号中(大括号“ { }”、中括号“ [ ]”、小括号“ ()”以及比较少用的括线“─”)

主要有两种初始化:完全初始化和不完全初始化

//完全初始化
int nums[3]={1,2,3};
//不完全初始化
int nums[6]={1};//第一个元素初始化位1,剩余元素默认初始化为0
//变长数组的初始化
数组的大小可以不填,默认为后边存放元素个数
int nums[]={1,2,3};

一维数组的使用

一维数组可以存放数据,存放数据是为了更好的处理数据

数组下标

规定了数组是有下标,下标是从0开始的,假设数组有n个元素,那么最后一个元素的下标是n-1,下标就相当于数组元素的编号,可用通过下标去访问数组中任意元素

请添加图片描述

问题:那么数组下标为什么是从0开始呢?是老美的习惯吗?

  • 从数组存储的内存模型来看,下标比较确切的定义是“偏移”,如果用a来表示数组的首地址,那么a[0]就表示偏移量为0的位置(这些需要配合指针那一块知识点来理解)。

在上边提及到了个下标操作符[],这个跟解引用操作符*效果是一样的,数组的本质是指针,在使用数组的时候编译器是转换为指针再进行使用的(在后面指针学习当中)

有了这个下标引用操作符,我们可用轻松的访问到数组的元素,主要是通过下标访问下标对应的数字,比如nums[1]==2;

简单数组的运用

数组是一组相同数据类型元素的集合,现在要求循环输入,输出(打印)数组的元素

int main()
{
	int arr[5]={1,2,3,4,5};
    for(int i=0;i<5;i++)
    {
		scanf("%d",&arr[i]);//数组输入
    }
    for(int j=0;j<5;j++)
    {
		printf("&d ",arr[i]);//数组输出
    }
}

问题:万一输出大于数组大小会怎么样呢?
1.一般来说会越界访问,但是编译器可能会报错,不是说这个越界问题可以不去管,它就是像一个逃犯一样,只是还没有逮捕到他(在可能越界的地方设置数值,查看数据是否被修改)
2.可能出现死循环,出现这样子的现象跟地址有关系(在指针那一块会涉及)

数组的元素地址

这里简单知道下数组是物理结构连续,逻辑结构连续的一种数据结构,这里的物理结构连续是指地址编号连续,不妨试一试打印数组元素的地址

int main()
{
	int nums[3]={1,2,3};
    for(int i=0;i<3;i++)
    {
		printf("nums[&d]地址==%p\n",&nums[i]);
    }
    return 0;
}

请添加图片描述

从结果上来看,数组随着下标的增长,地址是由小到大变化的,并且每两个相邻元素之间相错4(一个整形类型是4个字节)。可以得出数组在内存中连续存放,物理结构连续。

二维数组

语法:

typed(类型说明符)  arr_name(数组名)[常量值1][常量值2]
    例如:int nums[3][5];
上面反映的信息:
1.数组有三行
2.数组每一行有五个元素
3.int表示数组每个元素的类型,nums是数组的名字

小插入:数组名是数组首元素的地址,二维数组实际是由多个一维数组组成,将多个一维数组看成二维数组的元素,那么二维数组的数组名就是第一个一维数组的地址

二维数组的初始化

跟一维数组初始化一样,需要使用大括号初始化数值

主要有三种初始化:完全初始化和不完全初始,按照执行初始化

//完全初始化
int nums[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//不完全初始化
int nums[3][5]={0};
//按照执行初始化
int nums[3][5]={{1,2}.{3,4},{5,6}};
那么不完全初始化和按照执行初始化,剩余元素没有被初始化部分默认初始化为0
//初始化时可以省略行,但是不能省略列
int nums[][3]={1,2,3,4};
会根据数组中个数按照一列三个来分行,那么现在就是二行三列,其中第二行还是4 0 0

二维数组输入和输出(跟一维数据大差不差)

int main()
{
    int nums[2][3]={1,2,3, 4,5,6, 7,8,9};
    for(int i=0;i<2;i++)//产生行号
    {
		for(int j=0;j<3;j++)//产生列号
        {
			scanf("%d",&nums[i][j]);//输入数据
        }
    }
        for(int i=0;i<2;i++)//产生行号
    {
		for(int j=0;j<3;j++)//产生列号
        {
			printf("%d",nums[i][j]);//输出数据
        }
            printf("\n");
    }
}
从这里可以看出外层循环是产生行号,而内层循环是产生列号。一次外层循环可以经行多次内层循环,跟排队一样,第一篇,第二排。

二维数组的元素地址

既然通过打印一维数组地址得出数组在内存中存储方式,那么二维数组也是数组,是否满足这个存储方式呢?

int main()
{
	int nums[2][3]={0};
       for(int i=0;i<2;i++)
    {
		for(int j=0;j<3;j++)
        {
			printf("nums[%d][%d]地址 = %p\n",i,j,&nums[i][j]);
        }
    }
    return 0;
}

请添加图片描述

结果:从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0] [4]和arr[1] [0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。

变长数组

前文:在C99标准之前,C语言在创建数组时,数组大小只能指定常量,常量表达式或者初始化数据,可省略数组大小

导致了数组大小是固定,不够灵活去满足日常的需要。

C99中给⼀个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定数组⼤⼩。

语法:

int N=数值;
//scanf("%d",&N);
int nums[N];

变长数组的根本特征,数组长度根据程序中控制变量大小决定数组大小只有在程序运行时才能确定,导致变长数组不能初始化

  • 好处:在创建数组时,不需要为数组大小开辟太大空间,防止空间不足。变长数组可以在程序运行时为数组分配精确的长度
  • 注意:数组的大小一旦确定就不能再改变,所以数组的大小不是可变的,只是用一个变量指向数组的元素个数

遗憾的是在VS2022上,虽然支持大部分C99的语法,没有支持C99中的变⻓数组,没法测试。但是在OJ里面是支持使用

字符串在数组中应用(需要为\0多开辟一字节空间)

如果使用一维字符数组处理字符串,本质上就是以空字符结尾的字符数组

空字符

空字符就是 NULL,即’\0’。一个字符串可看成结尾为’\0’的不定长的一维字符数组

将字符串分解成每一个字符对待
“a”等同于’a’,’\0
“Hello!\n”等同于’H’,’e’,’1’,’1’,’o’,’!’,’\n’,’\0 

字符串的初始化

其中字符串也可经行变长数组初始化处理

字符数组可以由字符一个个存储在数组中,也可以用字符串(字符串常量)的形式储存(其中如果是字符串常量,编译器会自动加入’\0’,这个表示字符串的结尾标记)

char nums1[]={'a','b'};
char nums2[]={"hellow"};-->char nums2[]="hellow";//也可以这样子

字符串的输入–>涉及到scanf的知识点

%s字符串型格式符,可以使用它输入一个字符串

char s1[20];
scanf("%s",s1);

注意:数组名是首元素的地址,同时字符串的打印,如果得到字符串某个位置的地址,屏幕会自动打印后边的数据
因为%s不会包含空格和换行,所以无法用来读取多个单词,除非多个%s⼀起使⽤,导致了scanf不适合读取含有空格的字符串,可以采用单字符输入

单字符的输入

用 scanf输入字符或字符串时,遇到空格或回车结束。这不便于文字处理,一般用 getchar函数输入单字符。

int main()
{
	char ch;//定义一个字符类型变量
    ch=getchar();//到后面会分享这个函数
}

存储数据在数组中,总要知道数组存储多大的大小吧,如何下手呢?在指针章节结尾的时候,将配合面试喜欢出的面试题进行统一的学习!!!
请添加图片描述

感谢各位耐心观看!希望这篇关于数组的文章对你在学习C语言的道路上有所帮助!!!

标签:初始化,下标,数组,nums,int,元素,C语言,一维
From: https://blog.csdn.net/2302_79177254/article/details/136992393

相关文章

  • C语言自定义类型结构体详解
    C语言中,有内置类型,也就是C语言本身支持的现成的类型,例如int,char,double,float等,当然,仅有内置类型是不够的,例如,我们想表示一个变量人,但是现有的类型不支持我们表示,因此,我们引入了自定义类型,自定义类型分为://结构体struct//枚举-enum //联合体-union现在,我们介绍......
  • C语言经典例题(7) --- 计算三角形的周长和面积、球体的体积、变种水仙花数、时间转换
    文章目录1.计算三角形的周长和面积2.计算球体的体积3.变种水仙花数4.时间转换5.输出学生信息1.计算三角形的周长和面积题目描述:根据给出的三角形3条边a,b,c(0<a,b,c<100,000),计算三角形的周长和面积。输入描述:一行,三角形3条边(能构成三角形),中间用一个空......
  • C语言经典例题(8) --- 进制A+B、网购、及格分数、最高分数、计算一元二次方程
    文章目录1.进制A+B2.网购3.及格分数4.最高分数5.计算一元二次方程1.进制A+B题目描述:输入一个十六进制数a,和一个八进制数b,输出a+b的十进制结果(范围-231~231-1)。输入描述:一行,一个十六进制数a,和一个八进制数b,中间间隔一个空格。输出描述:一行,a+b的十进制结果......
  • 第二讲 C语言中的数据类型和变量
    1数据类型介绍C语言提供了丰富的数据类型来描述生活中的各种数据。使用整形类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。下列是C语言提供的各种数据类型:1.1字符型char[signed]char //有符号的unsignedchar //无符号的1.2整型//短整型......
  • Java数组(下)
    Java数组(下)多维数组多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组inta[][]=newint[2][5];//可以看成是一个两行五列的数组packagearray;publicclassArrayDemo05{publicstaticvoidmain(String[]args......
  • Leetcode 和为k的子数组
    Day11第一题#######解题思路:两层循环,用暴力法解决(从不同起始位置开始的子数组)classSolution{publicintsubarraySum(int[]nums,intk){//和为k的子数组的个数计数器countintcount=0;for(intj=0;j<nums.length;j++){......
  • 小阳同学刷题日记-209. 长度最小的子数组
        题目: 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。    惯例,献上我自......
  • 数据结构-数组
    数组是一种最为常见和应用广泛的数据结构,不用语言的数组不太一样,对于js的数组来说,和python的列表极其类似,都是可动态拓展值和类型的,还是来大致总结一下这个基础数据结构.创建数组letarr1=newArray('a','b',66)letarr2=['a','b',66]console.log(arr1......
  • 十八 1265. 数星星 (树状数组)
    1265.数星星(树状数组)思路:本题要统计每个星星左下角星星的数目,由于星星按y坐标增序给出,y坐标相同的按x坐标增序给出,所以不用关注y,可以视作每个x位置有几颗星星就为几的数组,每次统计左侧前缀和,再将当前计算的星星x位置数加一,使用树状数组(推荐视频:五分钟丝滑动画讲解|树状数......
  • C语言之结构体
    本篇我们来介绍一下结构体结构体是C语言中一种非常重要的数据类型,它允许我们将多个不同类型的数据组合在一起,形成一个新的数据类型,以便更好地组织和管理数据。在本篇博客中,我们将深入探讨结构体的概念、结构体变量的创建和初始化,以及结构体中存在的内存对齐问题。1.结构体......