C语言基础--二维数组

二维数组概念:

  数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组。

二维数组格式:

  元素类型 数组名称[一维数组的个数][每个一维数组的元素个数];

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

  元素类型:              说明二维数组中每个一维数组存储什么类型的数据

  一维数组的个数:         说明二维数组有多少个元素

  每个一维数组的元素个数 :  说明二维数组中每一个一维数组的元素个数

二维数组的定义:

 //可以看作由一维数组names[0]和一维数组names[1]组成,这两个一维数组都包含了3个char类型的元素
char names[][] =
{
// 0 1 2
{'l', 'n', 'j'}, //
{'l', 'm', 'j'} //
};

二维数组的初始化:

// 1.定义的同时初始化
int names[][] =
{
{'l', 'n', 'j'},
{'l', 'm', 'j'}
}; // 2.先定义再初始化
int names2[][];
names2[][] = 'l';
names2[][] = 'n';
names2[][] = 'j'; names2[][] = 'l';
names2[][] = 'm';
names2[][] = 'j'; // 3.完全初始化
int names3[][] =
{
{'l', 'n', 'j'},
{'l', 'm', 'j'}
}; // 4.不完全初始化
int names4[][] =
{
{'l', 'n'},
}; // 5.省略元素个数的两种写法
// 明确的告诉二维数组, 我们有2个一维数组
char names5[][] =
{
'l', 'n', 'j',
'l', 'm', 'j'
};
char names15[][] =
{
'l', 'n', 'j',
'n', 'b'
}; // 没有告诉二维数组我们有几个一维数组
// 如果在"定义的同时"进行初始化, 那么一位数组的个数可以省略
//系统会自动根据每一个一维数组能够存放多少个元素, 自动根据初始化的值推断出二维数组中一共有多少个元素(多少个一维数组)
char names6[][] =
{
'l', 'n', 'j',
'l', 'm', 'j',
'n', 'b'
}; // 6.错误写法
// 注意点: 每个一维数组的元素个数不能省略
int names7[][] =
{
{'l', 'n', 'j'},
{'l', 'm', 'j'}
}; // 搞不清楚应该分配多大的存储空间, 以及搞不清楚应该把哪些数据赋值给第一个数组, 哪些数据赋值给第二个数组
int names7[][] =
{
'l', 'n', 'j',
'l', 'm', 'j'
};

访问元素:

// 获取二维数组中的一维数组的元素的值
printf("%c\n", names[][]);

遍历:  

    // 如何遍历二维数组
// 思路: 1.取出二维数组的每一个元素(取出二维数组中的一维数组)
// 2.遍历一维数组
for (int i = ; i < ; i++) { // 0 , 1
// 1.取出一维数组
//names[i];
for (int j = ; j < ; 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)并且数组中元素之间的地址是连续。

  C语言基础--二维数组

二维数组与函数:

#include <stdio.h>
void change2(char names[][]);
void change3(char values[]);
void change4(char value); int main(int argc, const char * argv[]) {
char names[][] =
{
{'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[]); // 二维数组名称作为函数参数传递, 是传递的地址
change2(names);
// names[0] == 一维数组
change3(names[]);
// names[0][0] == 一维数组的一个元素 == 值
change4(names[][]); printf("names[0][0] = %c\n", names[][]);
return ;
}
// 接收基本数据类型
void change4(char value)
{
value = 'E';
printf("我执行了\n");
}
// 以后只要看到函数的参数是一个数组, 那么就是地址传递 在函数中修改形参的值会影响到参数
//接收一维数组
void change3(char values[])
{
values[] = 'Q';
printf("我执行了\n");
}
//接收二维数组 行数和列数不能省略
void change2(char values[][])
{
values[][] = 'w';
printf("我执行了\n");
}
上一篇:自己手写一个SpringMVC框架


下一篇:【Spring系列】自己手写一个 SpringMVC 框架