C语言之初识数组

简介: C语言之初识数组

# 数组简介


什么是数组呢?数字就是一组相同类型元素的集合,是按顺序存储的一系列类型的相同的值。比如说我们要创建一个含有10个int类型的值的数组arr1(数组名)、创建一个含有10个char类型的数组arr2。

1.png

 


注意:数组元素的编号是从0开始的,也就是说,这里的数组arr1的编号是0、1、2、3、4、5、6、7、8、9。一共有10个元素,数组arr2也同样如此。数组arr1的第一个元素是arr1[0],第二个元素是arr1[1],依此类推,直到最后一个元素(也就是第10个元素)arr1[9]。


如果我要给数组arr1中第五个元素赋值为8并将其打印,我们可以这样:

2.png



实际上,使用数组元素和使用同类型的变量一样,可以把某个值读入到某个元素中去。例如:

3.png



在前面,我们声明了数组arr1是一个可以储存10个元素,每个元素可以储存int类型的值,但这里要注意一个潜在的陷阱:考略到影响程序执行的速度,C编译器不会数组的下标是否正确。下面的代码都不是正确的:

4.png



该数组元素(arr1[10]=1和arr1[20]=2)其实是不存在的。


编译器不会查找这样的错误,当程序执行时,这样会导致数据放置在已被其他数据占据的地方,可能会破环程序的结果甚至导致程序异常中断。


当然,我们在创建数组时,数组的类型可以是任意类型:

5.png


现在我们把某字符串存储在char类型的数组中(一般而言,char类型数组都存储着char类型元素的值)。如果char类型的数组末尾包含一个表示字符串末尾结束的空字符\0,那么该数组的内容就可以构成一个字符串。如下:


# 一维数组的创建和初始化


数组的创建


前面讲到,数组是一组具有相同类型元素的集合,数组是这样创建的:

type_t   arr_name   [const_n];


//type_t是数组的元素类型   。


//arr_name是数组名。


//const_n是一个常量表达式,用来指定数组的大小,用来指定数组中有多少个元素。

6.png



那我们能不能这样创建数组:7.png


故当我们指定数组大小时,必须用常量表达式。


注意:数组创建,[]中要给一个常量才可以,不能使用变量。


一维数组的初始化


一维数组的初始化就是在数组创建的时候给数组的内容一些合理初始值(初始化)。如下:


8.png


不完全初始化时,其余元素默认为0。


下面来看其他数组的创建:


9.png


注意这里的arr2数组中包括前两个元素'a' 'b',后面三个元素均默认为0。


对于arr3数组,由于'\0'是字符串结束标志,所以第三个元素'\0'是我们自己放到数组arr3中去的,在这里只有后两个元素是被默认初始化为0的。


这两种写法得到的效果虽然是一样的看,但是方式是截然不同的。

10.png



这里我们在数组arr4中存放98可不可以呢,答案是肯定的,因为字符'b'对应的ASCII码值是98,所以就将98解析成字符'b'了。


我们在初始化时也可以不指定数组的大小,请看下面代码:

11.png



注意不要忘记最后一个元素'\0'。


总结:数组在创建时如果不指定数组的大小就得初始化,数组元素的个数会根据初始化的内容来确定。对于下面代码是需要我们格外注意区分其在内存中是如何存储的。


12.png


接下来,在讲解一维数组的使用之前,我们需要对sizeof()和strlen()进行简单的介绍,我们还是通过代码来介绍,下面请看:


13.png


看一下sizeof()和strlen()的区别:

1.sizeof和strlen没有什么关联


2.strlen是求字符串的长度的,只能针对字符串求长度--'\0'之前的字符个数--strlen是库函数--使用需要引用头文件


即#include<string.h>


3.sizeof计算的是变量,数组,类型的大小--单位是字节--是一个操作符


再来看一个例子:

14.png

15.png




## 一维数组的使用


对于数组的使用我们需要用到一个操作符:[],叫做下标引用操作符,它就是用来访问数组的操作符,下面看代码:

16.png


下面我们把数组arr中的abcdef都打印出来,请看:

17.png


我们也可以这样:

18.png


读者在编译代码是可能会出现警告:有符号/无符号不匹配,这是因为strlen函数默认返回的是一个无符号数,我们只需要进行强制类型转换,即:

19.png



我们通常是这样写的:


20.png


下面我们来展示一下整型数组:

21.png


总结:1.数组是通过下标来访问的,下标是从0开始。


2.数组的大小可以通过计算得到。


int arr[10];


int sz=sizeof(arr)/sizeof(arr[0]);


## 一维数组在内存中的存储


前面我们已经介绍了一维数组的创建和使用,那一维数组在内存中是怎样布局的呢?是怎样存储的呢?我们接着往下看 :

这里有一个整型数组,即int arr[]={1,2,3,4,5,6,7,8,9,10};    现在我们来打印出其每个元素的地址:

22.png


这里先说一下右边的数字是16进制数字


仔细观察我们可以发现每个元素之间都是相差4,原因很简单,因为每个元素都是整型,即每个元素都是4个字节,简单分析一下发现数组在内存中是连续存放的。其实,这里确实是在内存中连续开辟了一块空间,这块空间中就放着我们1到10这10个元素。


下面这副图一定要仔细揣摩一下,对理解数组的存储很有帮助(画图技术不是很好,大家凑合看哈^_^)

23.png


一维数组就暂时讲解到这里,接下来看二维数组。


# 二维数组的创建和初始化及其存储方式


对于二维数组的创建和初始化与一维数组并没有很大差别,只是形式上的差别。


二维数组的创建:


int arr1[3][2];  三行二列

char arr2[3][4];  三行四列

double arr3[2][4]; 二行四列


对于int arr[3][4]:


即:

24.png



在这里,有三行四列的整型元素,我们完全可以将其理解为有三行一维数组。


二维数组的初始化:


//数组初始化


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


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


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


来看一个二维数组不完全初始化的例子:

25.png


在前面二维数组的创建中,我们说到数组arr[3][4];将其理解为有三行一维数组,每一行都有四个元素。下面来看例子:

26.png



上面的arr数组依然是不完全初始化,其余元素自动补0即可。


注意:在二维数组初始化时,行可以省略,列不可以省略。请看:


27.png


接下来看二维数组的使用。


## 二维数组的使用及存储方式


二维数组的使用也是通过下标的方式,二维数组是多行多列的,当我们要访问其中的一个元素是,我们当然要指明这个元素是第几行第几列,这里有个数组:arr[3][4] = {{1,2,3},{3,5,6}};  


如果我们要将其所有的元素打印,请看代码:

28.png



那如果我们想打印每个元素的地址呢,我们可以这样:

29.png

30.png



刚才我们认为二维数组用上面这种方式存储的,实际上并不是,请看下面的图片 :

31.png



上面这种才是二维数组在内存中存放的方式。


总之,无论是一维数组,还是二维数组,其在内存中都是连续存储的。


以上就是本文的全部内容,主要讲解了一二维数组的创建、初始化、使用以及其在内存中的存储方式。最终目的是让读者初步认识数组,了解数组。


目录
相关文章
|
1月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
90 6
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
68 5
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
60 4
|
3月前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
62 6
|
3月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
106 9
|
3月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
3月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。