在C++中,指针和引用是两种不同的机制,它们都可以用来间接访问变量。
指针
指针的声明和初始化
指针是一个变量,其值为另一个变量的地址。指针的声明语法如下:
type* ptrName;
例如,声明一个指向整数的指针:
int* ptr;
初始化指针,使其指向一个变量:
int var = 10;
int* ptr = &var;
这里&var
是取地址运算符,它获取var
的内存地址。
指针运算
指针可以进行一些特定的运算,如增加指针的值来移动到下一个元素(对于数组指针):
ptr++; // 移动到下一个整数
也可以比较指针:
if (ptr1 == ptr2) {// 指针指向相同的地址
}
还可以使用指针访问和修改它所指向的值:
*ptr = 20; // 修改ptr所指向的值为20
指针和数组
指针可以用于数组的遍历:
int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr; // ptr指向数组的第一个元素
for (int i = 0; i < 5; ++i) {std::cout << *(ptr + i) << " "; // 输出数组元素
}
这里ptr + i
是指针的算术运算,它移动指针到数组的第i
个元素。
指针和函数
指针可以用来传递函数参数的地址,这样函数可以修改实际参数:
void increment(int* ptr) {(*ptr)++;
}int main() {int value = 0;increment(&value);std::cout << value << std::endl; // 输出1return 0;
}
动态内存管理(new和delete)
使用new
分配动态内存,并使用delete
释放:
int* ptr = new int(10); // 分配一个整数并初始化为10
delete ptr; // 释放内存
对于数组,使用new[]
和delete[]
:
int* arr = new int[5]; // 分配一个包含5个整数的数组
delete[] arr; // 释放数组内存
引用
引用的概念
引用是另一个变量的别名,一旦引用被初始化为一个变量,它就不能被改变为指向另一个变量。
引用的声明和使用
引用的声明语法如下:
type& refName;
例如,声明一个整数的引用:
int& ref = var;
这里ref
就是var
的别名,对ref
的任何操作都等同于对var
的操作。
引用和指针的区别
- 初始化:引用必须在声明时被初始化,而指针不必。
- 重新赋值:引用一旦被初始化后不能改变指向,而指针可以随时改变指向。
- 语法:使用引用时不需要解引用操作符
*
,而使用指针时需要。 - 语法糖:在函数参数中使用引用可以避免复制,提高效率,而指针则需要显式地解引用。
- 数组:不能有数组的引用,但可以有指向数组的指针。