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

目录

二维数组的定义与初始化

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

初始化的三种方式

示例:遍历与求最大值

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

指针的初始化与运算

实战练习


二维数组的定义与初始化

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

例如:

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。

相关推荐
源远流长jerry4 分钟前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
Sunshine for you8 分钟前
C++中的职责链模式实战
开发语言·c++·算法
@我漫长的孤独流浪21 分钟前
Python编程核心知识点速览
开发语言·数据库·python
lay_liu25 分钟前
Linux安装redis
linux·运维·redis
qq_4160187228 分钟前
C++中的状态模式
开发语言·c++·算法
2401_8845632429 分钟前
模板代码生成工具
开发语言·c++·算法
code 小楊35 分钟前
yrb 1.5.0 正式发布:Python 极简国内下载加速与全景可视化终端体验!
开发语言·python
2401_8319207443 分钟前
C++代码国际化支持
开发语言·c++·算法
m0_672703311 小时前
上机练习第51天
数据结构·c++·算法
ArturiaZ1 小时前
【day60】
算法·深度优先·图论