第十二课:指针强化
学习目标:
- 理解常量指针与指针常量的区别。
- 学习如何使用函数指针。
- 掌握指针与数组的高级使用技巧。
学习内容:
-
常量指针与指针常量
-
概念: 常量指针是一个指向常量的指针,这意味着不能通过这个指针来修改其指向的值。指针常量是一个指针,其自身的值不可以修改,但它可以修改其指向的内容。
-
代码示例:
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
-
使用场景: 当你想保护指针指向的数据不被修改时使用常量指针,当你不想改变指针的指向时使用指针常量。
-
-
函数指针
-
概念: 函数指针是指向函数的指针,通过这个指针可以调用不同的函数。
-
代码示例:
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!
-
使用场景: 当你需要在运行时调用不同的函数时,函数指针特别有用,例如回调函数或事件处理。
-
-
指针与数组的高级应用
-
概念: 指针可以用来遍历数组,通过指针偏移量来访问数组元素。
-
代码示例:
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