目录
二维数组的定义与初始化
二维数组的声明格式为:存储类型 数据类型 数组名[行数][列数]
例如:
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。