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

news/2025/1/19 3:56:54/

第十二课:指针强化

学习目标:

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

学习内容:

  1. 常量指针与指针常量

    • 概念: 常量指针是一个指向常量的指针,这意味着不能通过这个指针来修改其指向的值。指针常量是一个指针,其自身的值不可以修改,但它可以修改其指向的内容。
    • 代码示例:
      #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. 函数指针

    • 概念: 函数指针是指向函数的指针,通过这个指针可以调用不同的函数。
    • 代码示例:
      #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(); // 调用greetEnglishgreet = &greetSpanish; // 指向greetSpanish函数greet(); // 调用greetSpanishreturn 0;
      }
      
    • 预计输出效果:
      Hello!
      ¡Hola!
      
    • 使用场景: 当你需要在运行时调用不同的函数时,函数指针特别有用,例如回调函数或事件处理。
  3. 指针与数组的高级应用

    • 概念: 指针可以用来遍历数组,通过指针偏移量来访问数组元素。
    • 代码示例:
      #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函数中调用这个函数,并输出结果。

答案:

#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函数// 通过函数指针调用getMaxint 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

目录
第十三课:结构体和联合体


http://www.ppmy.cn/news/1329594.html

相关文章

【立创EDA-PCB设计基础】5.布线设计规则设置

前言&#xff1a;本文详解布线前的设计规则设置。经过本专栏中的【立创EDA-PCB设计基础】前几节已经完成了布局&#xff0c;接下来开始进行布线&#xff0c;在布线之前&#xff0c;要设置设计规则。 目录 1.间距设置 1.1 安全间距设置 1.2 其它间距设置 2.物理设置 2.1 导…

Kubernetes operator(一)client-go篇【更新中】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第一篇&#xff0c;主要对client-go进行学习&#xff0c;从源码阅读角度&#xff0c;学习client-go各个组件的实现原理、如何协同工作等参考视频&#xff1a;Bilibili 2022年最新k…

阿里云ECS(CentOS镜像)安装docker

目录 1.前置条件 2.连接至ECS 3.yum软件包更新 4.安装docker前置所需软件包 5.添加docker 官方的 yum 软件源 6.安装docker 7.检测是否成功 8.配置阿里云镜像加速器 1.前置条件 在看本文前保证未安装过docker,或者安装过但是清理干净 如果多次安装失败过&#xff0c;…

RTDETR 引入 UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

Armv8-M的TrustZone技术之内存属性单元

如果处理器包含Armv8-M安全扩展&#xff0c;则内存区域的安全状态由内部安全属性单元&#xff08;SAU&#xff0c;Secure Attribution Unit&#xff09;或外部实现定义的属性单元&#xff08;IDAU&#xff0c;Implementation Defined Attribution Unit&#xff09;的组合控制。…

基于SpringBoot的药品管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

linux下boost编译arm版本

1.下载 https://www.boost.org/users/history/version_1_74_0.html 2.解压 tar -zxvf boost_1_74_0.tar.gz 2.编译 ./bootstrap.sh --with-librariesfilesystem,thread --with-toolsetgcc3 替换gcc 修改配置文件project-config.jam,将下列的arm gcc编译器替换为你本机的编译器…

程序员裁员潮:技术变革下的职业危机

程序员裁员潮&#xff1a;技术变革下的职业危机 一对来自中国的工程师夫妻在美身亡&#xff0c;疑因谷歌裁员致悲剧发生。在技术变革下&#xff0c;裁员对于程序员的影响到底有多大&#xff1f; 背景 不知道到底凶杀的真相&#xff0c;他们也貌似不是辞退的&#xff0c;而我…