数组
目录
前言
编写程序过程中,有时候会用到大量的相同类型的数据。如果给每个变量都去单独定义,编程过程将会显得繁琐复杂,使用数组可以很好得解决这个问题。
一、一维数组
什么是数组?数组是一个由若干个相同类型的变量组成的集合,引用这些变量可以使用同一个名字。数组均有连续的存储单元组成,最低地址对应数组的第一个元素,最高地址对应于数组的最后一个元素。数组可以是一维数组也可以是多维数组。
1.1 一维数组的定义
一维数组实际上就是一组相同类型的数据的线性集合。
一维数组的定义形式如下:
类型 标识符[常量表达式];
类型:表示数组中元素的类型
标识符:表示该数组变量的名称,命名规则与变量名一致
常量表达式:定义数组中存放的元素个数,即数组长度
例如:定义一个包含5个整形元素的数组
int arr[5];
1.2一维数组的初始化
一维数组的初始化一般有三种方法。
1.定义数组时直接对数组赋初值(数组元素放在一对大括号中{})。
int arr[5]={
1,2,3,4,5};
2.只给一部分元素赋初值,未赋值的元素默认为0。
int arr[5]={
1,2,3}; //实际上数组元素是 1,2,3,0,0
3.给所有元素赋初值,不指定数组长度。
int arr[]={
1,2,3,4,5};
注意:使用第三种方法时一定要给数组元素赋值,否则会报错。
这样写是错的: int arr[]; ❌ int arr[] = {}; ❌
但是这样写是可以的: int arr[] = {0}; ✅ ==> 给arr数组赋了一个值为0的元素
1.3 一维数组的应用
遍历一维数组:
int arr[5] = {
1,2,3,4,5}; //计算数组中的元素个数 //sizeof(arr)计算数组arr总字节大小 sizeof(arr[0])计算arr数组中一个元素的字节大小 相除等于arr数组元素个数 int sz = sizeof(arr)/sizeof(arr[0]); for(int i = 0;i < sz;i++){
printf("%d ",arr[i]); }
1 2 3 4 5
1.4 一维数组在内存中的存储
一维数组在内存中的存储是怎样的呢?要想知道这个问题,我们先打印一下他的地址。
int arr[5] = {
1,2,3,4,5 }; int sz = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < sz; i++) {
printf("arr[%d] = %p\n",i ,&arr[i]); }
这里我们可以发现,每一个元素都相差4个字节,30–>34–>38–>3C–>40,这是怎么回事呢,我们来看一下图解:
在我们的内存中,每一小格就代表内存单元中的一个字节,因为int类型在内存中占4个字节,所以地址编号0-3所占的4个字节就是arr[0]这个数组元素,也就是我们打印出来的0076FD30这个地址。同理,地址编号4-7所占的4个字节是arr[1]数组元素,实际地址是0076FD34,arr[2],arr[3],arr[4]这里就不再赘述。
由上面的图解我么可以看出一维数组在内存中存放的特点:
🌟一维数组在内存中是连续存放的。
🌟随着数组下标的增长,存储地址是从低到高增长的。
二、二维数组
什么是二维数组?二维数组可以把他想象成一张表格,想要定位表格中的一格,就需要知道他的行号和列号。所以二维数组是有两个下标的,反过来说,C语言中,我们将下标有两个的数组称为二维数组。
2.1 二维数组的定义
二维数组可以看作是特殊的一维数组,其各元素仍是一个数组。
数据类型 数组名[常量表达式1][常量表达式2];
常量表达式1定义了数组的行数,常量表达式2定义了数组的列数。不管是行下标还是列下标,索引都是从0开始,定义一个m行n列的二维数组arr[m][n],行下标取值范围0到m-1,列下标取值范围0到n-1,最大下标元素是arr[m-1][n-1]。例如,定义一个3行4列的整形数组:
int arr[3][4];
2.2 二维数组的初始化
二维数组的初始化一般有四种情况。
1️⃣ 将数据写在一个大括号内,按照数组元素排列顺序给数组赋值。
int arr[2][3] = {
1,2,3,4,5,6};
如果大括号内的数据少于数组元素个数,系统会默认未被赋值的数组元素为0。
2️⃣ 为所有元素赋初值时,可以省略行下标,但不能省略列下标。
int arr[][3] = {
1,2,3,4,5,6};
3️⃣ 使用大括号{}将每一行数据放入一个大括号,内分行给数组元素赋值。
int arr[2][3] = {
{
1,2,3},{
4,5,6}};
4️⃣ 直接对数组元素赋值。
int arr[2][3]; arr[0][0] = 1; arr[0][1] = 2;
注意:不管使用哪种方法初始化二维数组,二维数组的列下标是不可以省略的。 int arr[2][ ]; ❌
2.3 二维数组的引用
二维数组元素的引用方式为“数组名[行下标][列下标]”,
int arr[2][3]={
1,2,3,4,5,6}; arr[1][2];// 6 arr[2][3];❌//报错!数组下标越界
同一维数组一样,我们在使用二维数组时也要注意不要超出下标范围。
2.4 二维数组在内存中的存储
我们可以遍历二维数组的地址。
int arr[2][3] = {
1,2,3,4,5,6 }; for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]); } }
对于二维数组我们可以将其看成是n个一维数组,n为行数。又图我们可以看出,每一行内部的每个元素都是相邻的,地址都是相差4个字节(int类型),跨行之间的元素(如:arr[0][2] 和arr[1][0])地址相差也是4个字节,由此我们可以推断出:
二维数组在内存中的存放方式也是连续的
2.5 二维数组的应用
将矩阵行列对换。
int arr1[2][3] = {
1,2,3,4,5,6}; int arr2[3][2]; for(int i = 0;i<2;i++){
for(int j = 0;j<3;j++){
printf("%d ",arr1[i][j]); arr2[j][i]=arr1[i][j]; //通过行列互换使arr2为arr1的转置数组 } printf("\n"); } printf("\n"); for(int i = 0;i<3;i++){
for(int j = 0;j<2;j++){
printf("%d ",arr2[i][j]); } printf("\n"); }
通过上述代码,我们很容易的将一个两行三列的矩阵转置成了三行两列的矩阵。
总结
C语言中除了一维数组和二维数组,还有多维数组。多维数组的声明和二维数组是一样的,只是下标更多而已。
arr[表达式1][表达式2]…[表达式n]。其用法和注意事项也是和二维数组一样的,多维数组在日常中使用很少,大部分还是一维和二维数组使用的比较多,所以这里就不再详细说明多维数组了。
数组方面的内容中还有数组的排序算法比较重要,数组的排序就放到下一篇文章中讲解。好了,以上就是关于C语言数组的知识,有什么问题或者文章哪里写的有不对的地方,欢迎评论区或私信告诉我。如果这篇文章对你有帮助的话请点赞收藏关注一下,感谢大家的支持~🌹🌹
今天的文章
c语言1维数组_数据结构c语言版第二版课后答案分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80398.html