二维数组详解:定义、初始化与实战

目录

二维数组的定义与初始化

二维数组的访问与内存布局

初始化的三种方式

示例:遍历与求最大值

指针基础:一级与二级指针

指针的初始化与运算

实战练习


二维数组的定义与初始化

二维数组的声明格式为:存储类型 数据类型 数组名[行数][列数]

例如:

c 复制代码
int a[2][3] = {2, 3, 4, 5, 6, 7};

初始化时可以省略行数,但不能省略列数:

c 复制代码
int a[][3] = {2, 3, 4, 5, 6, 7};  // 合法
int a[2][] = {2, 3, 4, 5, 6, 7};  // 非法

二维数组的访问与内存布局

二维数组按行优先存储,下标从0开始。例如a[2][3]的布局如下:

复制代码
a[0][0] a[0][1] a[0][2]  
a[1][0] a[1][1] a[1][2]  

数组名a表示首行地址,a+1表示第二行首地址。

计算字节大小:

c 复制代码
sizeof(a) == 行数 * 列数 * sizeof(int);  // 例如2行3列int数组占24字节

初始化的三种方式

完全初始化

c 复制代码
int a[2][3] = {2, 3, 4, 5, 6, 7};  
// 或按行分组初始化  
int a[2][3] = {{2, 3, 4}, {5, 6, 7}};  

部分初始化

未赋值的元素自动补0:

c 复制代码
int a[2][3] = {2, 3};        // 2 3 0 0 0 0  
int a[2][3] = {{2}, {5, 6}}; // 2 0 0 5 6 0  

未初始化

值为随机数:

c 复制代码
int a[2][3];  // 内容不确定

示例:遍历与求最大值

以下程序输出二维数组的指定行:

c 复制代码
#include <stdio.h>
int main() {
    int m[][3] = {1, 4, 7, 2, 5, 8, 3, 6, 9};
    int k = 2;
    for (int i = 0; i < 3; i++) {
        printf("%d ", m[k][i]);  // 输出第2行:3 6 9
    }
    return 0;
}

正确答案是选项 C)3 6 9


指针基础:一级与二级指针

一级指针

存储普通变量的地址:

c 复制代码
int num = 5;
int *p = #  // p指向num的地址
char b = 'w';
char *q = &b;   // q指向b的地址

指针操作符

  • &:取地址(如&num
  • *:解引用(如*p获取值)
    运算规则:
c 复制代码
*&num == num;  // 等价
&*p == p;      // 等价

指针的初始化与运算

避免野指针

定义时需初始化:

c 复制代码
int *p1 = NULL;  // 初始化为空
int c = 9;
p1 = &c;         // 后赋值
*p1 = 999;       // 修改c的值

指针与数组

数组名即首地址:

c 复制代码
int a[5] = {11, 3, 5, 7, 9};
int *p = a;
printf("%d\n", *p);  // 输出11(首元素)

指针算术

  • p + n:临时偏移,不改变指针指向
  • p++:永久偏移到下一元素
c 复制代码
int a[5] = {11, 22, 33, 44, 55};
int *p = a;
printf("%d\n", *p++);  // 输出11,p指向22
printf("%d\n", *++p);  // 输出33,p指向33

实战练习

题目1:间隔输出字符串

c 复制代码
#include <stdio.h>
int main() {
    char str[] = "Computer Science";
    char *p = str;
    while (*p != '\0') {
        printf("%c", *p);
        p += 2;  // 间隔输出
    }
    return 0;
}

输出结果:Cmue cec

题目2:字符串转整数

c 复制代码
#include <stdio.h>
int main() {
    char s[] = "123";
    int num = 0;
    char *p = s;
    while (*p != '\0') {
        num = num * 10 + (*p - '0');
        p++;
    }
    printf("%d\n", num);  // 输出123
    return 0;
}

关键点:字符'0''9'通过减去'0'转换为数字0~9。

相关推荐
格林威1 分钟前
Baumer相机金属弹簧圈数自动计数:用于来料快速检验的 6 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·堡盟相机
json{shen:"jing"}4 分钟前
js收官总概述
开发语言·python
188号安全攻城狮5 分钟前
【PWN】HappyNewYearCTF_9_ret2syscall
linux·汇编·安全·网络安全·系统安全
froginwe117 分钟前
Java 文档注释
开发语言
Zsy_0510037 分钟前
【C++】stack、queue、容器适配器
开发语言·c++
笨蛋不要掉眼泪7 分钟前
Spring Boot + RedisTemplate 数据结构的基础操作
java·数据结构·spring boot·redis·wpf
一起努力啊~9 分钟前
算法刷题--栈和队列
开发语言·算法
开开心心_Every10 分钟前
Win10/Win11版本一键切换工具
linux·运维·服务器·edge·pdf·web3·共识算法
万行10 分钟前
SQL进阶&索引篇
开发语言·数据库·人工智能·sql