C++自学笔记---指针在数组遍历中的应用

指针在数组遍历中的应用

在这一篇文章中,我们可以看到指针在数组遍历中的具体应用例子。

1. 赋值

我们要创建一个将数组的所有元素赋值为 1 的函数,并使用解引用运算符来访问数组元素.

代码为:

cpp 复制代码
#include <iostream>
using namespace std;

// 函数声明
void fill_zero(int* p, int n);  // 把 0 赋给数组 p 的前 n 个元素

int main() {
    // 定义一个数组
    int x[5] = {1, 2, 3, 4, 5};
    int x_size = sizeof(x) / sizeof(x[0]);  // 计算数组的元素个数

    // 调用函数,将数组 x 的所有元素设置为 0
    fill_zero(x, x_size);

    // 输出结果
    cout << "把 1 赋给了所有元素。\n";
    for (int i = 0; i < x_size; i++) {
        cout << "x[" << i << "] = " << x[i] << '\n';
    }

    return 0;
}

// 函数实现:把 0 赋给数组 p 的前 n 个元素
void fill_zero(int* p, int n) {
    while (n-- > 0) {  // 循环直到 n 为 0
        *p = 1;         // 将当前元素设置为 0
        p++;            // 指针移动到下一个元素
    }
}

重点我们看一下这个函数 fill_zero(int* p, int n) 是如何定义的:

cpp 复制代码
void fill_zero(int* p, int n) {
    while (n-- > 0) {  // 循环直到 n 为 0
        *p = 1;         // 将当前元素设置为 0
        p++;            // 指针移动到下一个元素
    }

while (n-- > 0) 是一个常见的循环结构,用于遍历数组。
n-- 的作用 :n-- 是后缀递减操作符,表示先使用 n 的当前值,然后再将 n 减 1。

例如,初始时 n = 5,n-- 的值为 5,然后 n 变为 4。
循环条件 :n-- > 0 表示只要 n 大于 0,循环就继续执行。每次循环结束后,n 会自动减 1。
循环过程: 初始时,n 是数组的元素个数(这里是 5)。每次循环中,*p = 0 将当前指针指向的元素设置为 0。p++ 将指针移动到下一个元素。当 n 减到 0 时,循环结束。

2. 线性查找

我们要写一个函数,这个函数能验证某个特定值的元素是否包含在数组中的程序。

代码1为:

cpp 复制代码
#include <iostream>
using namespace std;

// 函数声明
int seq_search(int* a, int n, int key);

int main() {
    int key, idx;
    int x[7];
    int x_size = sizeof(x) / sizeof(x[0]);  // 计算数组的元素个数

    // 输入数组元素
    for (int i = 0; i < x_size; i++) {
        cout << "x[" << i << "] : ";
        cin >> x[i];
    }

    // 输入要查找的值
    cout << "查找值:";
    cin >> key;

    // 调用线性查找函数
    if ((idx = seq_search(x, x_size, key)) != -1) {
    //这里比较复杂,把函数seq_search的返回值赋值给idx,然后再判断是否不等于-1
        cout << "具有该值的元素为 x[" << idx << "]." << endl;
    } else {
        cout << "没有找到。" << endl;
    }

    return 0;
}

// 函数实现:线性查找
int seq_search(int* a, int n, int key) {
    for (int i = 0; i < n; i++) {
        if (*a++ == key) {  // 检查当前元素是否等于目标值
            return i;       // 返回目标值的位置
        }
    }
    return -1;  // 如果未找到目标值,返回 -1
}

该函数的指针在内存中变化如下图所示:

这里只运用了一个指针a,既是数组名,又是指针名,相当于隐式指针,如果我们运用显示指针p呢?

cpp 复制代码
#include <iostream>
using namespace std;

// 函数声明
int seq_search(int* a, int n, int key);

int main() {
    int key, idx;
    int x[7];
    int x_size = sizeof(x) / sizeof(x[0]);

    for (int i = 0; i < x_size; i++) {
        cout << "x[" << i << "] : ";
        cin >> x[i];
    }

    cout << "查找值:";
    cin >> key;

    if ((idx = seq_search(x, x_size, key)) != -1)
        cout << "具有该值的元素为 x[" << idx << "]." << endl;
    else
        cout << "没有找到。" << endl;

    return 0;
}

// 函数实现:线性查找(第 2 版)
int seq_search(int* a, int n, int key) {
    int* p = a;
    while (n-- > 0) {
        if (*p == key)
            return p - a;
        else
            p++;
    }
    return -1;
}

这两版代码的不同点如下

  1. 循环结构:
    第 1 版:使用 for 循环,索引变量 i 从 0 到 n-1。
    第 2 版:使用 while 循环,通过 n-- > 0 控制循环次数。
  2. 指针操作:
    第 1 版:在 if 条件中使用 *a++,同时检查值并移动指针。
    第 2 版:显式地定义指针 p,并在循环中手动移动指针 p++。
  3. 返回值计算:
    第 1 版:直接返回索引 i。
    第 2 版:返回指针差值 p - a,计算当前元素的索引。

第 2 版通过显式指针操作提供了更多的灵活性,特别是在处理复杂数据结构时。第 2 版在某些情况下可能更高效,因为它避免了隐式操作。

相关推荐
find1star3 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing3 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21124 小时前
力扣160 21 86
算法·leetcode·职场和发展
Tairitsu_H4 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
小智老师PMP5 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN5 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218315 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤6 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
猎头南楼6 小时前
VLA 模型落地端侧:从架构选型到量化部署的工程实践笔记
笔记·架构·大模型
文心快码BaiduComate6 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法