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

目录

二维数组的定义与初始化

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

初始化的三种方式

示例:遍历与求最大值

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

指针的初始化与运算

实战练习


二维数组的定义与初始化

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

例如:

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。

相关推荐
阿沁QWQ1 小时前
Reactor反应堆模式
linux·运维·服务器
大佬,救命!!!1 小时前
C++函数式策略模式代码练习
开发语言·c++·学习笔记·学习方法·策略模式·迭代加深·多文件编译
冰西瓜6001 小时前
模与内积(五)矩阵分析与应用 国科大
线性代数·算法·矩阵
T***16071 小时前
JavaScript打包
开发语言·javascript·ecmascript
qq_336313931 小时前
java基础-常用的API
java·开发语言
No.Ada1 小时前
头歌-基于 socket 的网络编程
linux·服务器·网络
Samuel-Gyx1 小时前
数据结构--二叉树构造与遍历顺序的相互转化
数据结构
努力学算法的蒟蒻1 小时前
day17(11.18)——leetcode面试经典150
算法·leetcode·面试