📚 指针和引用概述
什么是指针?
指针是一个变量,它存储的是另一个变量的内存地址。通过指针,我们可以间接访问和修改该变量的值。
- ✅ 直接访问:通过变量名访问值
- ✅ 间接访问:通过指针访问值
- ✅ 灵活高效:可以动态管理内存
- ✅ 传递引用:避免大数据拷贝
💡 指针的核心概念:
• 指针存储的是地址,不是值
• 使用 * 声明指针
• 使用 & 获取变量地址
• 使用 * 解引用指针(访问指向的值)
指针的基本语法
#include <iostream>
using namespace std;
int main() {
int num = 42;
int* ptr;
ptr = #
cout << "变量num的值:" << num << endl;
cout << "变量num的地址:" << &num << endl;
cout << "指针ptr的值:" << ptr << endl;
cout << "指针指向的值:" << *ptr << endl;
*ptr = 100;
cout << "修改后num的值:" << num << endl;
return 0;
}
什么是引用?
引用是变量的别名,它和原变量共享同一块内存空间。引用必须在声明时初始化,且不能重新绑定到其他变量。
#include <iostream>
using namespace std;
int main() {
int num = 42;
int& ref = num;
cout << "num的值:" << num << endl;
cout << "ref的值:" << ref << endl;
cout << "num的地址:" << &num << endl;
cout << "ref的地址:" << &ref << endl;
ref = 100;
cout << "修改后num的值:" << num << endl;
return 0;
}
💡 指针 vs 引用:
• 指针:可以重新赋值、可以为nullptr、需要解引用
• 引用:必须初始化、不能重新绑定、直接使用
• 引用更安全,指针更灵活
⚙️ 指针基本操作
指针的声明和初始化
#include <iostream>
using namespace std;
int main() {
int* ptr1;
int num1 = 10;
ptr1 = &num1;
int num2 = 20;
int* ptr2 = &num2;
int* ptr3 = nullptr;
if (ptr3 == nullptr) {
cout << "ptr3是空指针" << endl;
}
cout << "*ptr1 = " << *ptr1 << endl;
cout << "*ptr2 = " << *ptr2 << endl;
return 0;
}
指针运算
#include <iostream>
using namespace std;
int main() {
int arr[] = {10, 20, 30, 40, 50};
int* ptr = arr;
cout << "ptr[0] = " << ptr[0] << endl;
cout << "ptr[1] = " << ptr[1] << endl;
ptr++;
cout << "ptr++后:*ptr = " << *ptr << endl;
ptr--;
cout << "ptr--后:*ptr = " << *ptr << endl;
int* ptr1 = &arr[0];
int* ptr2 = &arr[4];
cout << "距离:" << (ptr2 - ptr1) << endl;
return 0;
}
指针和数组的关系
#include <iostream>
using namespace std;
int main() {
int arr[] = {10, 20, 30, 40, 50};
cout << "arr = " << arr << endl;
cout << "&arr[0] = " << &arr[0] << endl;
int* ptr = arr;
for (int i = 0; i < 5; i++) {
cout << "arr[" << i << "] = " << *(ptr + i) << endl;
}
for (int i = 0; i < 5; i++) {
cout << "arr[" << i << "] = " << ptr[i] << endl;
}
return 0;
}
🎮 互动实验:指针可视化
输入一个数值,观察指针的操作过程
输入数值后点击按钮...
🛠️ 指针和引用的应用
指针作为函数参数
#include <iostream>
using namespace std;
void swapByPointer(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void swapByReference(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
cout << "交换前:x = " << x << ", y = " << y << endl;
swapByPointer(&x, &y);
cout << "指针交换后:x = " << x << ", y = " << y << endl;
swapByReference(x, y);
cout << "引用交换后:x = " << x << ", y = " << y << endl;
return 0;
}
const指针和引用
#include <iostream>
using namespace std;
int main() {
int num = 42;
int* const ptr1 = #
*ptr1 = 100;
const int* ptr2 = #
ptr2 = nullptr;
const int& ref = num;
cout << "num = " << num << endl;
return 0;
}
返回引用的函数
#include <iostream>
using namespace std;
int& findMax(int arr[], int size) {
int maxIndex = 0;
for (int i = 1; i < size; i++) {
if (arr[i] > arr[maxIndex]) {
maxIndex = i;
}
}
return arr[maxIndex];
}
int main() {
int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};
int& maxVal = findMax(arr, 8);
cout << "最大值:" << maxVal << endl;
maxVal = 99;
cout << "修改后:";
for (int i = 0; i < 8; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
🚀 高级指针技术
二级指针(指针的指针)
#include <iostream>
using namespace std;
int main() {
int num = 42;
int* ptr = #
int** pptr = &ptr;
cout << "num = " << num << endl;
cout << "*ptr = " << *ptr << endl;
cout << "**pptr = " << **pptr << endl;
**pptr = 100;
cout << "修改后num = " << num << endl;
return 0;
}
函数指针
#include <iostream>
using namespace std;
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) {
return a * b;
}
int main() {
int (*funcPtr)(int, int);
funcPtr = add;
cout << "add(3, 4) = " << funcPtr(3, 4) << endl;
funcPtr = multiply;
cout << "multiply(3, 4) = " << funcPtr(3, 4) << endl;
return 0;
}
实际应用:链表节点
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* createNode(int value) {
Node* newNode = new Node;
newNode->data = value;
newNode->next = nullptr;
return newNode;
}
void printList(Node* head) {
Node* current = head;
while (current != nullptr) {
cout << current->data << " -> ";
current = current->next;
}
cout << "NULL" << endl;
}
int main() {
Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
cout << "链表:";
printList(head);
return 0;
}
📝 实战练习
📝 理解测试
以下代码的输出是什么?
#include <iostream>
using namespace std;
void modify(int* p) {
*p = 100;
}
int main() {
int x = 50;
modify(&x);
cout << x << endl;
return 0;
}
选择答案查看解析...
💻 综合挑战
题目:编写一个程序,实现以下功能:
1. 创建一个整数数组
2. 使用指针遍历数组并找出最大值和最小值
3. 使用指针交换最大值和最小值的位置
4. 输出交换后的数组
点击"生成代码框架"查看提示...