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

目录

二维数组的定义与初始化

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

初始化的三种方式

示例:遍历与求最大值

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

指针的初始化与运算

实战练习


二维数组的定义与初始化

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

例如:

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。

相关推荐
星夜离尘5627 分钟前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi31 分钟前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者1 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
无足鸟ICT1 小时前
【RHCA+】ipcrm命令(删除IPC资源)
linux
csdn_aspnet2 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
Felven2 小时前
C. Brr Brrr Patapim
c语言·开发语言
星恒随风2 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
赤生云电竞2 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
小七在进步3 小时前
string的使用(2)
c++
路溪非溪3 小时前
python标准库使用总结
开发语言·python