面试题答案
一键面试指针和引用的主要区别:
- 定义:
- 指针:指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。可以通过
*
运算符来访问指针所指向的变量。例如:int* ptr;
定义了一个指向int
类型的指针。 - 引用:引用是已存在变量的别名,一旦初始化后就不能再引用其他变量。定义时必须初始化。例如:
int num = 10; int& ref = num;
定义了num
的引用ref
。
- 指针:指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。可以通过
- 内存分配:
- 指针:指针本身需要占用内存空间,用于存储所指向变量的地址。在32位系统下,指针通常占用4个字节,在64位系统下通常占用8个字节。
- 引用:引用本身不占用额外的内存空间,它只是被引用变量的别名。
- 可修改性:
- 指针:指针可以在初始化后重新指向其他变量。例如:
int a = 10, b = 20; int* ptr = &a; ptr = &b;
- 引用:引用一旦初始化后,就不能再引用其他变量。
- 指针:指针可以在初始化后重新指向其他变量。例如:
- 空值:
- 指针:指针可以为空(
nullptr
,在C++11之前是NULL
),表示不指向任何有效的内存地址。例如:int* ptr = nullptr;
- 引用:引用必须始终指向一个有效的对象,不存在空引用。定义引用时必须初始化。
- 指针:指针可以为空(
- 运算符:
- 指针:指针使用
*
运算符来访问所指向的变量,使用&
运算符来获取指针变量本身的地址。 - 引用:引用使用
&
运算符来声明,但在使用时就像使用被引用的变量一样,不需要额外的运算符来间接访问。
- 指针:指针使用
释放通过new
关键字创建的指针数组的内存:
#include <iostream>
int main() {
// 创建一个指针数组
int* arr[5];
for (int i = 0; i < 5; ++i) {
arr[i] = new int(i);
}
// 释放指针数组中的每个指针所指向的内存
for (int i = 0; i < 5; ++i) {
delete arr[i];
}
return 0;
}
如果使用new[]
创建数组,则需要使用delete[]
来释放内存,示例如下:
#include <iostream>
int main() {
// 创建一个指针数组
int** arr = new int*[5];
for (int i = 0; i < 5; ++i) {
arr[i] = new int(i);
}
// 释放指针数组中的每个指针所指向的内存
for (int i = 0; i < 5; ++i) {
delete arr[i];
}
// 释放指针数组本身的内存
delete[] arr;
return 0;
}