11. 指针与引用——编程世界的“魔法钥匙”

11.1 指针的基本概念

在 C++ 里,指针是一种特殊的变量,它存储的不是普通的数据值,而是内存地址。可以把指针想象成一把“钥匙”,这把“钥匙”指向内存中的某个特定位置,通过这把“钥匙”就能访问该位置存储的数据。

指针的定义和初始化 定义指针的基本语法为:数据类型* 指针变量名; 。下面是一个简单示例:

#include <iostream>
using namespace std;

int main() {
    int num = 10;
    // 定义一个指向 int 类型的指针
    int* ptr;
    // 让指针指向 num 的地址
    ptr = &num;
    return 0;
}

在这个程序中,& 是取地址运算符,&num 表示获取变量 num 的内存地址,然后把这个地址赋值给指针 ptr

通过指针访问数据 使用解引用运算符 * 可以通过指针访问其所指向的数据。示例如下:

#include <iostream>
using namespace std;

int main() {
    int num = 10;
    int* ptr = &num;
    // 通过指针访问 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;
}

在这个程序中,refnum 的引用,对 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 课后小练习

  1. 编写一个函数,使用指针遍历数组并计算数组元素的总和。
  2. 编写一个函数,接受一个引用作为参数,将该引用所引用的变量的值翻倍。

通过这部分的学习,你了解了指针和引用的基本概念、它们与数组和函数的关系,以及它们之间的区别。指针和引用是 C++ 中非常强大的工具,能帮助你更灵活地操作内存和实现高效的程序。

类似文章

发表回复