黑马程序员技术交流社区

标题: 二维数组 [打印本页]

作者: hugin    时间: 2016-9-23 08:44
标题: 二维数组
//---------------------二维数组
二维数组定义的一般形式是:

类型说明符 数组名[常量表达式1][常量表达式2]

//  1.
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};


// 2.
int arr[3][4] = {
    {1,2,3,4},    ------>   第1行 (第0行)    arr    --->   第0行元素-->
    {5,6,7,8},    ------>   第2行           arr[1][1]  -->  第i行第j个元素
    {9,10,11,12}  ------>   第3行
};


二维数组定义注意事项:

1)数组名严格遵守标识符命名规范

2)二维数组名不能和变量同名
int a;
int a[2][3];

3)数组长度可以是常量,也可以是常量表达式
int a[2+1][3+3]; //相当于定义了int a[3][5];

4)xcode编译器支持,C99标准不允许的写法
int x=3,y=4;
int a[x][y]; //相当于定义了int a[3][4];
//不允许直接初始化

5) 只定义不初始化,不可以省略长度


//--------------------二维数组初始化
二维数组可:
1)按行分段赋值
2)也可按行连续赋值。

1、定义同时初始化
2、先定义后初始化

部分初始化,其余自动初始化为0

二维数组可以看作是由一维数组的嵌套而构成的。

"二维数组初始化,不能省略第二维"

int a[][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};


//--------------------二维数组遍历
二维数组的元素也称为双下标变量

数组名[第一维下标][第二维下标]

数组名[行][列]

双层for循环/for嵌套

//--------------------二维数组存储
存储方式:
1)计算机会给二维数组分配一块"连续"的存储空间

2)数组名代表数组的首地址,从首地址位置,依次存入第1行、第2行、.....

3)每一行存储方式,从行首地址开始,依次存储行的第1个元素、第2个元素、第3个元素......

4)每个元素占用相同的字节数(取决于数组类型)

5)并且数组中元素之间的地址是连续。


//--------------------二维数组的长度 : 数组元素个数

int arr[2][3];

总计占用字节数: sizeof(arr);

每行占用字节数: sizeof(arr[0]);   //第一行元素占的总字节数

行数: 总字节数/每行字节数 --> sizeof(arr)/sizeof(arr[0]);

列数: 行数/每个类型 --> sizeof(arr[0])/sizeof(int)


//-------------------二维数组做函数参数
1、二维数组元素作为函数参数,相当于变量的"值传递"过程。


2、二维数组名作为函数参数,相当于"地址传递"。


1)在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,
如:
void Func(int array[3][10]);
void Func(int array[][10]);

注意: 二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,
# 不合法的:
void Func(int array[][]);
void Func(int array[3][]);

"一定不能省略第二维"

2)实参数组维数可以大于形参数组形参数组只取实参数组的一部分,其余部分不起作用。


3)类型长度要一致




作者: ding1226249413    时间: 2016-9-23 23:35
仔细想想 二维数组其实也没那么复杂的
作者: 梦想工程师    时间: 2016-9-24 00:11
好多定义方式好乱啊
作者: 我就是那匹黑黑    时间: 2016-9-24 00:24
总结得很好
作者: 琼华掌教    时间: 2016-9-24 21:58
呼呼呼呼就会一工具盒




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2