二维数组概念:
数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组。
二维数组格式:
元素类型 数组名称[一维数组的个数][每个一维数组的元素个数];
元素类型 数组名称[行数][列数];
元素类型: 说明二维数组中每个一维数组存储什么类型的数据
一维数组的个数: 说明二维数组有多少个元素
每个一维数组的元素个数 : 说明二维数组中每一个一维数组的元素个数
二维数组的定义:
//可以看作由一维数组names[0]和一维数组names[1]组成,这两个一维数组都包含了3个char类型的元素 char names[2][3] = { // 0 1 2 {'l', 'n', 'j'}, // 0 {'l', 'm', 'j'} // 1 };
二维数组的初始化:
// 1.定义的同时初始化 int names[2][3] = { {'l', 'n', 'j'}, {'l', 'm', 'j'} }; // 2.先定义再初始化 int names2[2][3]; names2[0][0] = 'l'; names2[0][1] = 'n'; names2[0][2] = 'j'; names2[1][0] = 'l'; names2[1][1] = 'm'; names2[1][2] = 'j'; // 3.完全初始化 int names3[2][3] = { {'l', 'n', 'j'}, {'l', 'm', 'j'} }; // 4.不完全初始化 int names4[2][3] = { {'l', 'n'}, }; // 5.省略元素个数的两种写法 // 明确的告诉二维数组, 我们有2个一维数组 char names5[2][3] = { 'l', 'n', 'j', 'l', 'm', 'j' }; char names15[2][3] = { 'l', 'n', 'j', 'n', 'b' }; // 没有告诉二维数组我们有几个一维数组 // 如果在"定义的同时"进行初始化, 那么一位数组的个数可以省略 //系统会自动根据每一个一维数组能够存放多少个元素, 自动根据初始化的值推断出二维数组中一共有多少个元素(多少个一维数组) char names6[][3] = { 'l', 'n', 'j', 'l', 'm', 'j', 'n', 'b' }; // 6.错误写法 // 注意点: 每个一维数组的元素个数不能省略 int names7[2][] = { {'l', 'n', 'j'}, {'l', 'm', 'j'} }; // 搞不清楚应该分配多大的存储空间, 以及搞不清楚应该把哪些数据赋值给第一个数组, 哪些数据赋值给第二个数组 int names7[2][] = { 'l', 'n', 'j', 'l', 'm', 'j' };
访问元素:
// 获取二维数组中的一维数组的元素的值 printf("%c\n", names[0][0]);
遍历:
// 如何遍历二维数组 // 思路: 1.取出二维数组的每一个元素(取出二维数组中的一维数组) // 2.遍历一维数组 for (int i = 0; i < 2; i++) { // 0 , 1 // 1.取出一维数组 //names[i]; for (int j = 0; j < 3; j++) { // 0 , 1 , 2 printf("name[%i][%i] = %c\n", i, j, names[i][j]); } }
存储方式:
1)计算机会给二维数组分配一块连续的存储空间
2)数组名代表数组的首地址,从首地址位置,依次存入第1行、第2行、.....
3)每一行存储方式,从行首地址还是,依次存储行的第1个元素、第2个元素、第3个元素......
4)每个元素占用相同的字节数(取决于数组类型)
5)并且数组中元素之间的地址是连续。
二维数组与函数:
#include <stdio.h> void change2(char names[2][3]); void change3(char values[]); void change4(char value); int main(int argc, const char * argv[]) { char names[2][3] = { {'l', 'n', 'j'}, {'l', 'm', 'j'} }; // &names == names == &names[0] , names就是数组的地址 printf("&names = %p\n", &names); printf("names = %p\n", names); printf("&names[0] = %p\n", &names[0]); // 二维数组名称作为函数参数传递, 是传递的地址 change2(names); // names[0] == 一维数组 change3(names[0]); // names[0][0] == 一维数组的一个元素 == 值 change4(names[0][0]); printf("names[0][0] = %c\n", names[0][0]); return 0; } // 接收基本数据类型 void change4(char value) { value = 'E'; printf("我执行了\n"); } // 以后只要看到函数的参数是一个数组, 那么就是地址传递 在函数中修改形参的值会影响到参数 //接收一维数组 void change3(char values[]) { values[0] = 'Q'; printf("我执行了\n"); } //接收二维数组 行数和列数不能省略 void change2(char values[2][3]) { values[0][1] = 'w'; printf("我执行了\n"); }