5.1 地址与指针的概念
在 C++ 中,地址与指针是重要的概念,它们在内存管理和程序设计中起到了关键的作用。在本节中,我们将学习地址和指针的概念以及如何在 C++ 中使用它们。
5.1.1 内存地址
内存是计算机用来存储数据和程序的地方。每个内存单元都有唯一的地址。地址是用来访问内存中特定位置的标识符。在 C++ 中,可以使用取地址运算符 & 来获取变量的内存地址。
代码示例:
#include <iostream> int main() { int num = 10; std::cout << "变量num的内存地址: " << &num << std::endl; return 0; }
输出:
变量num的内存地址:0x7ffc2d6f003c
在上面的例子中,我们声明了一个整型变量 num,使用取地址运算符 & 获取了变量 num 的内存地址,并通过 std::cout 输出了该地址。
5.1.2 变量的地址
在 C++ 中,我们可以将变量的地址存储在指针变量中。指针变量是一种特殊的变量,它用于存储其他变量的地址。可以使用指针变量来间接访问原始变量。
代码示例:
#include <iostream> int main() { int num = 10; int *ptr = # // 定义一个整型指针变量ptr,将num的地址赋值给ptr std::cout << "变量num的内存地址: " << ptr << std::endl; std::cout << "指针变量ptr的值: " << *ptr << std::endl; return 0; }
输出:
变量num的内存地址:0x7ffc2d6f003c 指针变量ptr的值:10
在上面的例子中,我们定义了一个整型指针变量 ptr,将变量 num 的地址赋值给了 ptr。然后,我们通过 *ptr 访问了原始变量的值。
5.1.3 变量的指针
在 C++ 中,可以使用指针来操作变量本身。通过改变指针的值,我们可以改变指针所指向的变量的值。
代码示例:
#include <iostream> int main() { int num = 10; int *ptr = # // 定义一个整型指针变量ptr,将num的地址赋值给ptr *ptr = 20; // 改变指针所指向的变量 std::cout << "变量num的值: " << num << std::endl; return 0; }
输出:
变量num的值:20
在上面的例子中,我们通过指针变量 ptr 改变了 num 的值。通过 *ptr = 20,我们将指针所指向的变量的值改为了 20。
总结:
地址是用来访问内存中特定位置的标识符。
可以使用取地址运算符 `&获取变量的内存地址。
指针变量是用来存储其他变量的地址的特殊变量。
可以使用指针变量来间接访问原始变量。
可以通过改变指针的值来改变指针所指向的变量的值。
5.2 指针变量及指针运算
5.2.1 指针变量
指针是一种特殊类型的变量,其存储的是内存地址。通过指针可以访问和修改对应地址上存储的数据。下面是一个通过指针变量存取变量值的例子:
【例 5-1】通过指针变量存取变量的值
#include <iostream> using namespace std; int main() { int x = 10; // 定义一个整数变量 x,并赋值为 10 int *ptr; // 定义一个指向整数类型的指针变量 ptr ptr = &x; // 将指针变量 ptr 指向 x 的地址 cout << "x 的值为:" << x << endl; cout << "通过指针变量访问 x 的值为:" << *ptr << endl; *ptr = 20; // 修改 ptr 所指向的地址中存储的值 cout << "修改后 x 的值为:" << x << endl; return 0; }
输出结果:
x 的值为:10 通过指针变量访问 x 的值为:10 修改后 x 的值为:20
在上述例子中,我们通过指针变量 ptr 来存取变量x的值。首先,我们将指针变量 ptr 指向变量 x的地址,然后通过指针变量 ptr 访问变量 x 的值,并且可以通过修改指针变量 ptr 所指向地址中的值来修改变量 x 的值。
【例 5-2】输入 a 和 b 两个整数,按从小到大的顺序输出
#include <iostream> using namespace std; void sort(int *a, int *b) { if (*a > *b) { int temp = *a; *a = *b; *b = temp; } } int main() { int a, b; cout << "请输入两个整数:" << endl; cin >> a >> b; sort(&a, &b); cout << "从小到大排序后的结果为:" << a << ", " << b << endl; return 0; }
输出结果:
请输入两个整数: 5 3 从小到大排序后的结果为:3, 5
在上述例子中,我们定义了一个函数 sort,该函数接受两个指向整数的指针作为参数。在函数内部,我们通过判断指针所指向的变量的大小关系,交换变量的值,从而实现从小到大的排序。
5.2.2 指针运算
指针变量与整数可以进行加减运算,称为指针运算。下面是一个指针与整数的加减运算的例子:
【例 5-3】指针与整数的加减运算
#include <iostream> using namespace std; int main() { int arr[] = {1, 2, 3, 4, 5}; int *ptr = arr; // 指向数组的第一个元素的指针 cout << "ptr 的初始值为:" << ptr << endl; ptr += 2; // 将指针加 2 cout << "ptr 加 2 后的值为:" << ptr << endl; ptr -= 1; // 将指针减 1 cout << "ptr 减 1 后的值为:" << ptr << endl; return 0; }
输出结果:
ptr 的初始值为:0x7ffee418b4a0 ptr 加 2 后的值为:0x7ffee418b4a8 ptr 减 1 后的值为:0x7ffee418b4a4
在上述例子中,我们定义了一个整数数组 arr,并定义了一个指向数组第一个元素的指针 ptr。通过指针加减整数的运算,可以使指针指向数组中的其他元素。
【例 5-4】指针的关系运算
#include <iostream> using namespace std; int main() { int arr[] = {1, 2, 3, 4, 5}; int *ptr = arr; // 指向数组的第一个元素的指针 cout << "ptr 的初始值为:" << ptr << endl; cout << "指针与整数的关系运算:" << endl; for(int i = 0; i < 5; i++) { cout << "arr + " << i << " 的值为:" << arr + i << endl; if(arr + i == ptr) { cout << "arr + " << i << " 等于 ptr" << endl; } } return 0; }
输出结果:
ptr 的初始值为:0x7ffee418b4a0 指针与整数的关系运算: arr + 0 的值为:0x7ffee418b4a0 arr + 0 等于 ptr arr + 1 的值为:0x7ffee418b4a4 arr + 2 的值为:0x7ffee418b4a8 arr + 3 的值为:0x7ffee418b4ac arr + 4 的值为:0x7ffee418b4b0
在上述例子中,我们通过指针与整数的关系运算来比较指针与数组元素的地址。可以看到,当两者相等时输出相应的信息。
C++学习笔记:指针与数组