11. 指针与引用——编程世界的“魔法钥匙”
11.1 指针的基本概念
在 C++ 里,指针是一种特殊的变量,它存储的不是普通的数据值,而是内存地址。可以把指针想象成一把“钥匙”,这把“钥匙”指向内存中的某个特定位置,通过这把“钥匙”就能访问该位置存储的数据。
指针的定义和初始化 定义指针的基本语法为:数据类型* 指针变量名;
。下面是一个简单示例:
#include <iostream> using namespace std; int main() { int num = 10; // 定义一个指向 int 类型的指针 int* ptr; // 让指针指向 num 的地址 ptr = # return 0; }
在这个程序中,&
是取地址运算符,&num
表示获取变量 num
的内存地址,然后把这个地址赋值给指针 ptr
。
通过指针访问数据 使用解引用运算符 *
可以通过指针访问其所指向的数据。示例如下:
#include <iostream> using namespace std; int main() { int num = 10; int* ptr = # // 通过指针访问 num 的值 cout << "num 的值是: " << *ptr << endl; return 0; }
这里的 *ptr
表示访问 ptr
所指向的内存位置存储的值。
11.2 指针与数组
数组名在很多情况下可以看作是指向数组首元素的指针。例如:
#include <iostream> using namespace std; int main() { int arr[5] = {1, 2, 3, 4, 5}; // 数组名 arr 可看作指向数组首元素的指针 int* ptr = arr; for (int i = 0; i < 5; i++) { // 通过指针访问数组元素 cout << *(ptr + i) << " "; } cout << endl; return 0; }
在这个程序中,arr
是数组名,它相当于指向数组第一个元素 arr[0]
的指针。ptr + i
表示指针向后移动 i
个位置,*(ptr + i)
则访问移动后指针所指向的元素。
11.3 指针与函数
指针可以作为函数的参数,这样在函数内部就可以修改实参的值,实现数据的双向传递。
示例代码:使用指针交换两个整数的值
#include <iostream> using namespace std; // 函数:使用指针交换两个整数的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int num1 = 3, num2 = 5; cout << "交换前: num1 = " << num1 << ", num2 = " << num2 << endl; swap(&num1, &num2); cout << "交换后: num1 = " << num1 << ", num2 = " << num2 << endl; return 0; }
在这个程序中,swap
函数接受两个指向 int
类型的指针作为参数,通过指针修改了实参的值。
11.4 引用的基本概念
引用可以看作是变量的别名,它和所引用的变量共享同一块内存空间。定义引用的基本语法为:数据类型& 引用变量名 = 被引用的变量名;
。示例如下:
#include <iostream> using namespace std; int main() { int num = 10; // 定义一个引用 int& ref = num; cout << "num 的值是: " << num << endl; cout << "ref 的值是: " << ref << endl; // 修改引用的值,相当于修改原变量的值 ref = 20; cout << "修改后 num 的值是: " << num << endl; return 0; }
在这个程序中,ref
是 num
的引用,对 ref
的操作就相当于对 num
的操作。
11.5 引用作为函数参数
引用作为函数参数可以避免值传递带来的复制开销,同时也能实现数据的双向传递。
示例代码:使用引用交换两个整数的值
#include <iostream> using namespace std; // 函数:使用引用交换两个整数的值 void swap(int& a, int& b) { int temp = a; a = b; b = temp; } int main() { int num1 = 3, num2 = 5; cout << "交换前: num1 = " << num1 << ", num2 = " << num2 << endl; swap(num1, num2); cout << "交换后: num1 = " << num1 << ", num2 = " << num2 << endl; return 0; }
在这个程序中,swap
函数接受两个引用作为参数,通过引用直接修改了实参的值。
11.6 指针和引用的区别
- 定义和初始化:指针需要使用
*
来定义,并且可以在定义后再赋值;而引用在定义时就必须初始化,并且一旦初始化就不能再引用其他变量。 - 内存占用:指针本身占用一定的内存空间,用于存储内存地址;而引用只是变量的别名,不额外占用内存空间。
- 使用方式:指针可以进行算术运算,如指针的加减操作;而引用主要用于简化变量的使用,不支持指针的算术运算。
11.7 课后小练习
- 编写一个函数,使用指针遍历数组并计算数组元素的总和。
- 编写一个函数,接受一个引用作为参数,将该引用所引用的变量的值翻倍。
通过这部分的学习,你了解了指针和引用的基本概念、它们与数组和函数的关系,以及它们之间的区别。指针和引用是 C++ 中非常强大的工具,能帮助你更灵活地操作内存和实现高效的程序。