C语言————数组(一维数组和二维数组)

CSDN的同学们大家好!,今天的学习的内容是数组,数组又分为一维数组和二维数组,那么这两个数组有什么不同呢?让我们去见识见识,let's go!

  • 前言
  • 一、数组是什么?
  • 二、数组的分类
    • 1.一维数组
    • 2.二维数组


前言

数组对于所有编程语言来说都是重要的数据结构之一,数组可以帮我们巧妙解决生活中的问题,使我们的代码简洁。


一、数组是什么?

数组是一组相同类型元素的集合。

它有数组元素类型数组名数组的大小构成

二、数组的分类

1.一维数组

代码如下:

int arr[10];
int是指数组元素的类型
arr是指数组名
10是指一个常量表达式,用来指定数组的大小

int n=10;
int arr[n];
如果这样写可以初始化成功吗?
注意:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数
组的概念,数组的大小可以使用变量指定,但是数组不能初始化。
如果你的编译器支持C99标准就可以使用一个变量来指定数组大小,但是数组不能初始化哦。

数组的初始化
int arr[5]={1,2,3,4,5};
int arr1[]={1,2,3};
int arr2[3] = {'a',98,'c'};
int arr3[] = {'a','b','c'};
char arr[]="abcedf";

C语言————数组(一维数组和二维数组)_第1张图片

C语言————数组(一维数组和二维数组)_第2张图片

 通过调试窗口我们可以发现,数组在初始化的时候,可以指定数组大小也可以不给常量来表明数组的元素个数,数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。通过arr2和arr3就可以看出,虽然两个数组的元素相同,但一个初始化确定了数组大小,另一个没有初始化确定数组大小,数组也可以通过里面的内容确定元素个数

但有另一个情况,如果数组的指定大小大于数组元素个数,那么剩余的后面都是'\0'或者0;

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

char arr1[5]="abc"; 

 C语言————数组(一维数组和二维数组)_第3张图片C语言————数组(一维数组和二维数组)_第4张图片

C语言————数组(一维数组和二维数组)_第5张图片

 对于数组的使用我们离不开一个操作符 [] ,下标引用操作符。它其实就数组访问的操作符。

int a=10;
printf("%d",sizeof(a));输出4
printf("%d",sizeof(int));输出4

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	           下标  0 1 2 3 4 5 6 7 8 9
printf("%d",arr[0]);输出1的值
那么我们怎么样可以计算数组元素的值呢?
int sz=sizeof(arr)/sizeof(arr[0]);
               40/4=10;
#include 
int main()
{
   int arr[10] = {0};//数组的不完全初始化
   //计算数组的元素个数
  int sz = sizeof(arr)/sizeof(arr[0]);
 //对数组内容赋值,数组是使用下标来访问的,下标从0开始。
 int i = 0;//做下标
 for(i=0; i<10; i++)
 {
    arr[i] = i;
 }
 //输出数组的内容
 for(i=0; i<10; ++i)
 {
 printf("%d ", arr[i]);
 }
 return 0;
}
//屏幕输出0~9
1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。

那我们再来看看一维数组中的存储是怎么样?

#include 
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; ++i)
	{
		printf("&arr[%d] = %p\n", i, &arr[i]);
	}
	return 0;
}

C语言————数组(一维数组和二维数组)_第6张图片

从运行结果可以看出 ,随着元素下标的增长,元素的地址也在有规律的递增。

这个从元素相差4个字节的地址,因为数组的元素类型是int,int在c语言中占据4个字节。

由此我们可以得出结论:数组在内存中的存储是连续存放的,而且还是由低到高。

2.二维数组

代码如下:

二维数组的创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
二维数组与一维数组不同,int arr中[3]表示行数,[4]表示列数。
二维数组的初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{3,4},{5,6}};
int arr[][4] = {{7,8},{9,10}};
在二维数组中,行可以省略,但列不能省略

//让我们来打印一下二维数组吧
#include 
int main()
{
	int arr[3][4] = {0};
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
这相于一个模板,把上面的二维数组一个个套进去即可。

C语言————数组(一维数组和二维数组)_第7张图片

C语言————数组(一维数组和二维数组)_第8张图片

C语言————数组(一维数组和二维数组)_第9张图片

 当我们打印输出二维数组,是不是有点类似矩阵,其实就是矩阵,大家可以通过二维的数组的列在确定行数,这就是为什么二维数组中行可以省略,列不能省略的原因!

那么二维数组的下标是怎么表示的呢?

C语言————数组(一维数组和二维数组)_第10张图片

如果把二维数组的每一行看做一个一维数组,那么每一行数组都有数组名。

arr[0]就是第一行的数组名  arr[1]就是第二行的数组名 以此类推。

int arr[10][5];

arr[i]=0~9

arr[j]=0~4

1的下标就是arr[0][0]  2的下标是arr[0][1] 3的下标是arr[0][2] 4的下标是arr[0][3]

以及类推,用i表示行数,用j表示列数,二维的下标也是从0开始的。

其实仔细想一想,一维数组就是没有行数的二维数组。

那么二维数组中的存储是怎么样的呢?

#include 
int main()
{
	int arr[3][4];
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

C语言————数组(一维数组和二维数组)_第11张图片

通过结果可以看到,二维数组的存储与一维数组中的存储类似,也是随着元素下标的增长,元素地址也有规律的递增。而地址的相差也是元素类型int4个字节的相差。 

二维数组的存储也是由低到高存储,连续存放的。


你可能感兴趣的:(c语言)