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 语言高效访问内存的核心方式

下期预告

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

相关推荐
wljy12 小时前
二、进制状态转换
linux·运维·服务器·c语言·c++
云泽8082 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
ʚ希希ɞ ྀ2 小时前
不同路径|| -- dp
算法
01_ice3 小时前
C语言数据在内存中的存储
c语言·开发语言
bucenggaibian3 小时前
《C语言》编程前置:计算机底层逻辑(诞生的基础)
c语言·程序框架·编译运行·内存地址·底层逻辑
IT 行者3 小时前
SimHash 与 MinHash:相似性计算的双子星算法
算法·hash·比对
智者知已应修善业4 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业4 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
小娄~~5 小时前
C语言卷子错题集
c语言·开发语言·数据结构