大家好,我是网域小星球。
上一篇我们学习了指针基础,理解了指针就是地址、&取地址、*解引用。而在 C 语言里,数组和指针关系极其紧密,甚至可以说:数组在底层就是用指针实现的。
掌握指针操作数组,不仅能让代码更简洁高效,更是理解字符串、函数传参、数据结构的关键。本篇从本质到实战层层拆解,全程 VS2022 可直接运行,零基础也能轻松掌握。
目录
[示例 1:基础遍历](#示例 1:基础遍历)
[1. 修改元素](#1. 修改元素)
[1. 指针数组](#1. 指针数组)
[2. 数组指针](#2. 数组指针)
一、本章学习目标
学完本篇你将彻底掌握:
- 数组名的本质:数组名是数组首元素的地址
- 指针与数组通用访问规则:
a[i] == *(a+i) - 用指针遍历一维数组
- 指针操作数组元素:修改、查找、赋值
- 指针数组与数组指针的简单区分
- 高频易错点与规范写法
二、数组名的本质
一句话:数组名 = 数组首元素的地址
例如:
cpp
int arr[5] = {10, 20, 30, 40, 50};
arr等价于&arr[0]- 数组名是一个常量地址,不能修改(不能 arr++)
这是指针与数组一切关系的基础。
三、核心等价公式(必背)
cpp
arr[i] == *(arr + i)
含义:
- 数组下标访问
arr[i] - 本质就是指针偏移 + 解引用
所以下面两种写法完全等价:
cpp
printf("%d", arr[2]);
printf("%d", *(arr + 2));
都表示第 3 个元素(下标 2)。
四、指针遍历数组(最常用写法)
示例 1:基础遍历
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
int *p = arr; // p 指向数组首地址
for (int i = 0; i < 5; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
示例 2:指针移动遍历
cpp
int main()
{
int arr[5] = {1,2,3,4,5};
int *p = arr;
for (int i = 0; i < 5; i++)
{
printf("%d ", *p);
p++; // 指针向后移动一个 int
}
return 0;
}
输出:
cpp
1 2 3 4 5
五、指针操作数组元素
1. 修改元素
cpp
int arr[5] = {1,2,3,4,5};
int *p = arr;
*(p + 2) = 300; // 等价于 arr[2] = 300;
- 查找最大值
cpp
int main()
{
int arr[5] = {11,33,22,55,44};
int *p = arr;
int max = *p;
for (int i = 1; i < 5; i++)
{
if (*(p+i) > max)
max = *(p+i);
}
printf("max = %d\n", max);
return 0;
}
六、指针与字符串(重点)
字符串本质是 char 数组,所以指针操作字符串非常常用。
cpp
int main()
{
char str[] = "hello";
char *p = str;
while (*p != '\0')
{
printf("%c", *p);
p++;
}
return 0;
}
输出:
cpp
hello
七、易混概念简单区分
1. 指针数组
存放指针的数组:
cpp
int *arr[5];
2. 数组指针
指向数组的指针:
cpp
int (*p)[5];
入门阶段只需记住:数组名就是首地址,用指针可以遍历数组即可。
八、高频易错点
- 数组名是常量地址,不能写
arr++ - 指针越界:偏移超过数组长度导致崩溃
- 混淆
*p++、(*p)++、*(p++) - 字符串指针忘记
\0导致乱码 - 把数组地址直接赋值给错误类型指针
九、本章核心总结
- 数组名本质:首元素地址 ,即
arr == &arr[0] - 下标与指针等价:
arr[i] == *(arr+i) - 指针可以遍历、修改、查找数组元素
- 字符串用指针遍历更简洁
- 数组名不可修改,指针可以移动
- 指针 + 数组是 C 语言高效访问内存的核心方式
下期预告
下一篇我们学习结构体,学会自己定义 "复合型变量",比如学生、员工、书籍等,实现更贴近现实的数据管理,也是做小项目必备知识。