从0开始学习C++ 第十二课:指针强化

第十二课:指针强化

学习目标:

  • 理解常量指针与指针常量的区别。
  • 学习如何使用函数指针。
  • 掌握指针与数组的高级使用技巧。

学习内容:

  1. 常量指针与指针常量

    • 概念: 常量指针是一个指向常量的指针,这意味着不能通过这个指针来修改其指向的值。指针常量是一个指针,其自身的值不可以修改,但它可以修改其指向的内容。

    • 代码示例:

      cpp 复制代码
      #include <iostream>
      
      int main() {
          int value = 10;
          int anotherValue = 20;
      
          // 常量指针
          const int *ptr = &value;
          // ptr = &anotherValue; // 正确,可以改变指针指向
          // *ptr = 15; // 错误,不能通过ptr改变value的值
      
          // 指针常量
          int *const ptrConst = &value;
          *ptrConst = 15; // 正确,可以改变value的值
          // ptrConst = &anotherValue; // 错误,不能改变指针的指向
      
          std::cout << "Value through constant pointer: " << *ptr << std::endl;
          std::cout << "Value through pointer constant: " << *ptrConst << std::endl;
          
          return 0;
      }
    • 预计输出效果:

      复制代码
      Value through constant pointer: 10
      Value through pointer constant: 15
    • 使用场景: 当你想保护指针指向的数据不被修改时使用常量指针,当你不想改变指针的指向时使用指针常量。

  2. 函数指针

    • 概念: 函数指针是指向函数的指针,通过这个指针可以调用不同的函数。

    • 代码示例:

      cpp 复制代码
      #include <iostream>
      
      void greetEnglish() {
          std::cout << "Hello!" << std::endl;
      }
      
      void greetSpanish() {
          std::cout << "¡Hola!" << std::endl;
      }
      
      int main() {
          // 函数指针
          void (*greet)() = nullptr;
          greet = &greetEnglish; // 指向greetEnglish函数
          greet(); // 调用greetEnglish
      
          greet = &greetSpanish; // 指向greetSpanish函数
          greet(); // 调用greetSpanish
      
          return 0;
      }
    • 预计输出效果:

      复制代码
      Hello!
      ¡Hola!
    • 使用场景: 当你需要在运行时调用不同的函数时,函数指针特别有用,例如回调函数或事件处理。

  3. 指针与数组的高级应用

    • 概念: 指针可以用来遍历数组,通过指针偏移量来访问数组元素。

    • 代码示例:

      cpp 复制代码
      #include <iostream>
      
      int main() {
          int numbers[] = {10, 20, 30, 40, 50};
          int *ptr = numbers; // 指向数组第一个元素
      
          for (int i = 0; i < 5; ++i) {
              std::cout << "Number[" << i << "] = " << *(ptr + i) << std::endl;
          }
      
          return 0;
      }
    • 预计输出效果:

      复制代码
      Number[0] = 10
      Number[1] = 20
      Number[2] = 30
      Number[3] = 40
      Number[4] = 50
    • 使用场景: 当需要遍历数组或动态分配的数组时,指针提供了一种灵活的访问和操作数组元素的方式。

练习题: 编写一个C++程序,创建一个包含5个整数的数组。使用函数指针指向一个函数,该函数将数组作为参数,并返回数组中的最大值。在main函数中调用这个函数,并输出结果。

答案:

cpp 复制代码
#include <iostream>

// 函数原型声明
int getMax(int*, int);

int main() {
    int arr[] = {3, 1, 4, 1, 5};
    int arraySize = sizeof(arr) / sizeof(arr[0]);

    // 函数指针声明
    int (*funcPtr)(int*, int) = nullptr;
    funcPtr = &getMax; // 指向getMax函数

    // 通过函数指针调用getMax
    int max = funcPtr(arr, arraySize);
    std::cout << "The maximum value in the array is: " << max << std::endl;

    return 0;
}

// 定义getMax函数
int getMax(int* array, int size) {
    int max = array[0];
    for (int i = 1; i < size; ++i) {
        if (array[i] > max) {
            max = array[i];
        }
    }
    return max;
}

预计输出效果:

复制代码
The maximum value in the array is: 5
相关推荐
沐欣工作室_lvyiyi几秒前
家庭水资源节能系统设计(论文+源码)
c++·python·云平台·单片机毕业设计·单片机仿真·电子信息工程毕业设计·机械电子工程
FelixZhang0285 分钟前
量化求真10|回测通过以后,策略就能上场吗?
人工智能·python·深度学习·学习·机器学习·金融·lstm
Vcaker11 分钟前
Linux学习33-HPA动态扩缩容及k8s调度策略
linux·运维·学习
yi01115 分钟前
LeetCode 134 加油站:从 双循环暴力 演变到 贪心
linux·算法·leetcode
Yyyyyy~16 分钟前
[c++]数组
c++
知识分享小能手23 分钟前
C++ 学习教程,从入门到精通,C++内存模型和名称空间 — 详细知识点总结(9)
开发语言·c++·学习
sogw-三叶草️27 分钟前
LeetCode 989. 数组形式的整数加法
数据结构·算法
2601_9622186131 分钟前
c++中多重继承与虚继承的实现
开发语言·c++
AOI小白新手上路38 分钟前
韦东山《ARM 架构与编程》3-2 GPIO 引脚操作方法概述 · 学习笔记
arm开发·学习·架构
沫璃染墨41 分钟前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》
c++·qt·ui·硬件工程·交互·个人开发·qt5