C 语言从 0 入门(十二)|指针与数组:数组名本质、指针遍历数组

大家好,我是网域小星球。

上一篇我们学习了指针基础,理解了指针就是地址、&取地址、*解引用。而在 C 语言里,数组和指针关系极其紧密,甚至可以说:数组在底层就是用指针实现的。

掌握指针操作数组,不仅能让代码更简洁高效,更是理解字符串、函数传参、数据结构的关键。本篇从本质到实战层层拆解,全程 VS2022 可直接运行,零基础也能轻松掌握。

目录

一、本章学习目标

二、数组名的本质

三、核心等价公式(必背)

四、指针遍历数组(最常用写法)

[示例 1:基础遍历](#示例 1:基础遍历)

五、指针操作数组元素

[1. 修改元素](#1. 修改元素)

六、指针与字符串(重点)

七、易混概念简单区分

[1. 指针数组](#1. 指针数组)

[2. 数组指针](#2. 数组指针)

八、高频易错点

九、本章核心总结

下期预告

一、本章学习目标

学完本篇你将彻底掌握:

  1. 数组名的本质:数组名是数组首元素的地址
  2. 指针与数组通用访问规则:a[i] == *(a+i)
  3. 用指针遍历一维数组
  4. 指针操作数组元素:修改、查找、赋值
  5. 指针数组与数组指针的简单区分
  6. 高频易错点与规范写法

二、数组名的本质

一句话:数组名 = 数组首元素的地址

例如:

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;
  1. 查找最大值
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];

入门阶段只需记住:数组名就是首地址,用指针可以遍历数组即可。


八、高频易错点

  1. 数组名是常量地址,不能写 arr++
  2. 指针越界:偏移超过数组长度导致崩溃
  3. 混淆 *p++(*p)++*(p++)
  4. 字符串指针忘记 \0 导致乱码
  5. 把数组地址直接赋值给错误类型指针

九、本章核心总结

  1. 数组名本质:首元素地址 ,即 arr == &arr[0]
  2. 下标与指针等价:arr[i] == *(arr+i)
  3. 指针可以遍历、修改、查找数组元素
  4. 字符串用指针遍历更简洁
  5. 数组名不可修改,指针可以移动
  6. 指针 + 数组是 C 语言高效访问内存的核心方式

下期预告

下一篇我们学习结构体,学会自己定义 "复合型变量",比如学生、员工、书籍等,实现更贴近现实的数据管理,也是做小项目必备知识。

相关推荐
wuminyu6 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
MediaTea7 小时前
AI 术语通俗词典:C4.5 算法
人工智能·算法
Navigator_Z7 小时前
LeetCode //C - 1033. Moving Stones Until Consecutive
c语言·算法·leetcode
WBluuue7 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
风筝在晴天搁浅8 小时前
n个六面的骰子,扔一次之后和为k的概率是多少?
算法
iCxhust8 小时前
微机原理实践教程(C语言篇)---A001闪烁灯
c语言·开发语言·汇编·单片机·嵌入式硬件·51单片机·微机原理
爱编码的小八嘎9 小时前
C语言完美演绎9-9
c语言
MATLAB代码顾问9 小时前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
代码飞天9 小时前
机器学习算法和函数整理——助力快速查阅
人工智能·算法·机器学习
jiushiapwojdap9 小时前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab