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

目录

二维数组的定义与初始化

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

初始化的三种方式

示例:遍历与求最大值

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

指针的初始化与运算

实战练习


二维数组的定义与初始化

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

例如:

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。

相关推荐
达帮主7 小时前
25.C语言 递归函数
c语言·开发语言·汇编
炘爚7 小时前
深入解析内存分区:程序运行的秘密
c++
yunhuibin7 小时前
Linux 7.0 调度器:C 语言面向对象(OOPC)的极致实践
linux·运维·c语言
feng_you_ying_li7 小时前
linux之进程概念:体系结构,操作系统的基本介绍
linux
整点薯条7787 小时前
用 Python 给家里做一次噪音频谱审计:程序员的声学工程实践(含完整源码)
开发语言·python·噪音控制
洋不写bug7 小时前
Java线程(三):线程执行顺序问题、可重入锁、加锁操作解析,死锁解决
java·开发语言
子非吾喵7 小时前
本地部署AI大模型:Ollama + Qwen3 完整指南,用Python打造智能聊天助手
开发语言·人工智能·python
诸葛务农7 小时前
光电对抗:多模复合制导烟雾干扰外场试验及仿真(4)
人工智能·算法·光电对抗
尘世壹俗人7 小时前
linux编译安装git
linux·运维·git
lsx2024067 小时前
Vue3 安装指南
开发语言