Linux基础学习笔记6(C语言基础:二维整型数组 & 二维字符型数组)

一、二维整型数组(int 二维数组)

1. 定义方式

数据类型 数组名[行数][列数];

备注:(1)行数、列数必须是整型常量或常量表达式
(2)数据类型不能为 void

示例

int a[2][3];   // 2行3列,总共6个元素

二维数组从“数组的数组”角度理解:

a -> int[][]
a[0] -> int[]
a[0][0] -> int

2. 二维数组元素访问

int a[2][3] = {{1,2,3}, {4,5,6}};

a[0][0]  = 1
a[0][1]  = 2
a[0][2]  = 3
a[1][0]  = 4
a[1][1]  = 5
a[1][2]  = 6

3. 初始化方式

(1)完全初始化

int a[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

(2)按行顺序初始化

int b[2][3] = {1,2,3,4,5,6};

(3)局部初始化(未给出的补 0)

// 其余元素为 0
int a1[2][3] = {1,2,3,4}; 
int b2[2][3] = {{1,2}, {3}};

(4)全部置零

int c1[2][3] = {0};
int c2[2][3] = {{0}};

4. 行可以省略,列不能省略(编译器需要列数)

int a[][3] = {1,2,3,4};  // 自动计算需要 2 行
int b[][3] = {{1,2},{3}};

5. 二维数组的内存特征

二维数组的三个特征:
(1)单一性:所有元素类型相同
(2)连续性:内存中按行存放,是一段连续空间
(3)有序性:元素有固定的行列顺序

二维数组本质:由多个一维数组组成的数组

6. 使用 sizeof 获取二维数组信息

int array_test[2][3] = {0};

int size = sizeof(array_test);
int row  = sizeof(array_test) / sizeof(array_test[0]);
int col  = sizeof(array_test[0]) / sizeof(array_test[0][0]);

printf("size:%d row:%d col:%d\n", size, row, col);

7. 遍历二维数组

for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
        printf("row:%d col:%d value:%d\n", i, j, array_test[i][j]);
    }
}

二、二维字符型数组(字符矩阵 / 字符串数组)

说明:二维字符数组用于存储多个字符串。例如:存储 5 个名字、多个单词、多个路径等。

1. 定义方式

char str[行数][列数];

示例

char str[2][100];     // 可存储 2 个字符串,每个最长 99 个字符(1 个 '\0'

内存模型

str -> char[][]
str[0] -> char[]
str[0][0] -> char

2. 二维字符数组的初始化

(1)按字符串初始化(最常用)

char str[2][100] = {"hello", "world"};

对应内存:

str[0] = "hello\0"
str[1] = "world\0"

(2)传统字符写法

char str2[5][32] = {
    {"hello"},
    {"world"},
    {"1234"},
    {"how"},
    {"you ###"}
};

(3)全部清零

char str4[5][32] = {0};
char str5[5][32] = {{0}};

(4)省略行数(编译器自动确定行数)

char str6[][32] = {"hello", "world", "how", "are", "you"};

3. 元素访问

str[0][0]   // 'h'
str[1][0]   // 'w'
str[1][2]   // 'r'

4. 使用 sizeof 获取二维字符数组信息

char str_test[3][100] = {0};

int size = sizeof(str_test);                // 300
int row  = sizeof(str_test) / sizeof(str_test[0]); // 3
int col  = sizeof(str_test[0]) / sizeof(str_test[0][0]); // 100

5. 二维字符数组与字符串函数

函数功能注意点
strlen()求字符串长度遇到 '\0' 结束
strcpy()字符串拷贝覆盖目标内容,注意空间
strcmp()字符串比较返回差值
strcat()字符串拼接目标数组必须空间足够

示例

strcpy(str[1], "new word");
strcat(str[0], "!!!");
int ret = strcmp(str[0], str[1]);

6. 二维字符数组 VS 字符指针数组(拓展)

特点二维字符数组字符指针数组
存储方式所有字符串连续存储字符串分散,存储的是指针
内存分配编译期固定可以指向常量或动态分配
是否可修改内容可修改字符串常量不可修改
用途多个等长字符串字符串列表、命令行参数

示例

char arr1[3][20] = {"aaa", "bbb", "ccc"};      // 内容可修改
char *arr2[3] = {"aaa", "bbb", "ccc"};         // 指向只读区

三、二维数组总结

类型用途存储内容优点缺点
二维整型数组矩阵、表格、图像数据int结构固定,连续存储灵活度较低
二维字符数组多个字符串char每个字符串长度固定,访问快可能浪费空间
字符指针数组字符串列表char*节省空间,灵活字符串可能只读,容易越界
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值