首页 > 其他分享 >二维数组的学习

二维数组的学习

时间:2022-10-23 21:10:10浏览次数:85  
标签:arr int 元素 学习 二维 数组 列数

1.二维数组的声明。

1)。二维数组首先是1个数组,所以它符合数组的特点

a.元素的类型相同。

b.存储的数据的个数固定。

c.方便管理数据。

2)。二维数组的独有的特点:

二维数组是1个有行有列的表格。使用单元格来存储数据。

单元格就是二维数组的元素。

3)。声明二维数组的语法。

元素类型 数组名[行数][列数];

int arr[1][2];

表示在在内存中声明了1个二维数组,这个二维数组的名字叫做arr这个二维数组表示1个1行2列的表格。

每1个单元格 就是这个二维数组的1个元素。每1个元素的类型是int

4)。术语。

a.元素:元素就是这个表格的每1个单元格。

二维数组的每1个元素的下标有两个1个是行下标 1个是列下标,先行后列

b.长度:我们一般认为就是单元格的个数,行*列。

2.往二维数组中存储数据

1)。二维数组中真正存储数据的是表格中的每1个元素。

使用下标来确定二维数组中的元素,二维数组的元素的下标有两个,行下标 列下标。

二维数组名[行下标][列下标]=数据;

int arr[3][4];

arr[1][2] =100:

将100存储到arr数组的第1行的第2列的那个元素中。

2)。为二维数组的元素赋值的数据的类型要和元素的类型一致

否则就会做自动类型转换。

3)。行列下标请不要越界。

3.从二维数组中取出数据

1)。二维数组中真正存储数据的是表格中的每1个元素。

二维数组名[行下标][列下标];

2).行列下标不要越界。

4. 遍历二维数组的元素。

for(int i = 0;i<行数;i++)

{

for(int j = 0;j <列数;j++)

{

arr[i][j];

}

#include<stdio.h>
int main()
{
int arr[2][3];//声明二维数组
arr[0][0]=1;//往数组中储存数据
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
for (int i = 0; i < 2; i++)//利用for循环遍历数据
{
for (int j = 0; j < 3; j++)
{
arr[i][j];
printf("%d\n", arr[i][j]);//将数据打印
}
}
return 0;
}

5.使用二维数组要注意的地方。

1).关于二维数组的行数和列数

a.在声明二维数组的时候 必须要指定行数和列数。

b.并且这个行数和列数:可以是变量、常量、宏、表达式,也可以是1也可以是0

行数和列数不能是小数、负数。

2)。关于二维数组的元素的默认值。

如果我们声明1个二维数组 没有为这个二维数组的元素。这个二维数组的元素是有值的 值是1个垃圾值。

6.二维数组的元素初始化

1)。全部初始化。

a.先声明,再使用下标来初始化。

b.在声明的同时,就初始化数组的每一个元素。

int arr[3][4] ={{10,20,30,40},//第0行的数据

                      {50,60,70,80},//第1行的数据

                      {90,100,110,120}//第2行的数据。};

里面的大括弧,就表示1行。

c.上面这种方式初始化的时候,可以省略行数。

int arr[][4] ={{10,20,30,40},//第0行的数据

                     {50,60,70,80},//第1行的数据

                     {90,100,110,120}//第2行的数据。};

根据大括弧的个数,编译器来自动确定行数。

d.直接省略里面的大括弧.编译器根据行数和列数自动判断哪些属于哪1行的,

int arr[3][4] = {10,20,30,40,50,60,70,80,90,100,110,120};

e.上面的那种初始化方式 可以省略行数。编译器根据列数和数据的个数自动计算行数。

int arr[][4] = {10,20,30,40,50,60,70,80,90,100,110,120};

2)。部分初始化。

a. int arr[3][4] = {{10},{20},{30}};

初始化指定行的数据,那么其他的元素就会被自动初始化为0。

10 20 30 0

 0  0   0  0

0   0   0  0

b. int arr[3][4] = {10,20,30,40,50};

按照顺序去初始化每1个元素其他的元素的值就会被自动初始化为0

10 20 30 40

50  0   0   0

0    0   0   0

c.int arr[][4] = {10,20,30,40,50};

省略行数,自动根据后面的元素的个数来计算行。其他的元素自动初始化为0

10 20 30 40

50  0   0   0

0    0   0   0

d. int arr[3][4] = {[1]={10,20,30,40},[2]={50,60,70,80}};

给指定的行初始化,其他的元素自动初始化为00000

10 20 30 40

50 60 70 80

e. int arr[3][4] ={[0][1] = 20,[1][3] = 60};

给指定的元素赋值。其他的元素自动初始化为0

0 20 0 0

0 0 0 60

0 0 0  0

注意

1)。在声明二维数组的同时使用大括弧初始化数组的元素,这个时候行数可以省略。记住,列数不能省略。

2)。在声明二维数组的同时 如果不使用大括弧初始化元素 那么就必须要写行数和列数。

7.二维数组的储存

int arr[2][3];

1).从高地址向低地址申请了连续的(行 * 列 * 每1个元素占用的字节)个字节空间。

2)。第0行是在低字节,

二维数组在内存中仍然是1块连续的空间,并不是一个表格。第0行在低字节。

8. 二维数组的本质。

二维数组其实是一个一维数组。

只不过,这个一维数组的每一个元素的类型又是1个数组,

int arr[2][3];

这其实是1个一维数组,这个一维数组的长度是2。

只不过这个一维数组的元素的类型是 1个长度为3的数组。


所以,二维数组的每1行,其实是1个一维数组。

9.二维数组的地址

组成这个二维数组的低字节的地址就是这个二维数组的地址。

也就是第0行的地址。也就是第0行的第0个元素的地址,

二维数组名 就代表这个二维数组的地址。

二维数组的地址==二维数组名==二维数组的第0行的地址==二维数组的第0行的第0个元

10.二维数组的长度以及行列计算。

1)。求二维数组的长度,真正的元素的个数。

用二维数组占用的总的字节数除以 每1个元素占用的字节数。

2).求行数

二维数组的每1行占用的字节数是一样的。所以。

用总的字节数 除以每1行占用的字节数,就可以去到行数。

3).求列数。

每1行的总字节数 除以 每1个元素的字节数。

11.二维数组可以作为函数的参数。

1)。如果函数的参数是1个二维数组。那么在调用的时候,实参也必须是1个同类型的二维数组。

2)。当二维数组作为函数的参数的时候,会丢失这个二维数组的行数和列数。

因为声明参数二维数组的时候,并不是去创建1个二维数组。而是创建1个用来存储数组地址的指针变量而指针变量是占据8个字节,

所以这个时候,在函数的内部使用sizeof去计算参数二维数组的占用的字节的时候永远都是8个字节。

3)。当二维数组作为函数的参数的时候,

行数可以省略不写,但是列数不能省略必须要写。并且实参二维数组和形参二维数组

实参的行数可以任意,但是列数必须要和形参的列数一致。

4)。解决方案:

让调用者将二维数组的行数和列数都传递到函数内部来,所以,至少还要加2个参数,1个行 1个列.

实参二维数组的列数必须要和形参二维数组的列数一致。

写参数的时候,先写行数和列数,最后再写二维数组,然后二维数组的列数用参数指定。

void test2( int rows,int cols,int arr[[cols]);


标签:arr,int,元素,学习,二维,数组,列数
From: https://blog.51cto.com/u_15809685/5787565

相关文章