上期回顾: 【C++】内存管理和内存优化
个人主页:C_GUIQU
归属专栏:C++
目录
正文
1. 指针
1.1 指针的基本概念
指针是一种变量,它存储的是另一个变量的内存地址。通过指针,可以间接访问和操作其所指向的变量。
1.2 举例
#include <iostream>
int main() {
int num = 10; // 定义一个整型变量num,初始值为10
int *ptr; // 定义一个指向整型的指针ptr,此时它未指向任何有效的内存地址
ptr = # // 将指针ptr指向变量num的地址,&是取地址运算符
std::cout << "num的值为:" << num << std::endl;
std::cout << "num的地址为:" << &num << std::endl;
std::cout << "ptr指向的值为:" << *ptr << std::endl; // *是解引用运算符,用于获取指针所指向的值
std::cout << "ptr的地址为:" << &ptr << std::endl;
return 0;
}
在上述代码中:
- 首先定义了一个整型变量
num
并赋值为10
。 - 接着定义了一个整型指针
ptr
,开始它未指向任何有效地址。 - 通过
ptr = #
将ptr
指向了num
的地址。 - 然后分别输出了
num
的值、地址,ptr
指向的值(通过解引用*ptr
)以及ptr
自身的地址。
1.3 指针的运算
指针可以进行一些特定的运算,常见的有算术运算和关系运算。
1.3.1 算术运算
- 指针的加法和减法运算通常与它所指向的数据类型的大小相关。例如,对于一个指向整型(
int
)的指针,如果执行ptr++
,那么指针会移动到下一个整型数据的地址,实际上是在内存地址上增加了sizeof(int)
个字节。
示例代码:
#include <iostream>
int main() {
int arr[5] = {
1, 2, 3, 4, 5};
int *ptr = arr; // 让指针ptr指向数组arr的首地址
std::cout << "ptr指向的元素为:" << *ptr << std::endl;
ptr++; // 指针向后移动一个元素的位置
std::cout << "ptr指向的元素为:" << *ptr << std::endl;
return 0;
}
在这个例子中,数组 arr
包含了 5
个整型元素。指针 ptr
初始指向数组的首地址,即 arr[0]
的地址。当执行 ptr++
后,指针就指向了 arr[1]
的地址,通过解引用就可以获取到 arr[1]
的值。
1.3.2 关系运算
- 指针可以进行比较运算,如
==
、!=
、<
、>
等。通常用于判断两个指针是否指向同一个地址,或者判断一个指针是否在某个地址范围之内。
示例代码:
#include <iostream>
int main() {
int num1 = 10;
int num2 = 20;
int *ptr1 = &num1;