面试题答案
一键面试数组指针
- 定义:数组指针是一个指针,它指向一个数组。
- 声明方式:
type (*pointer_name)[array_size];
,例如int (*ptr)[3];
表示ptr
是一个指向包含 3 个int
类型元素的数组的指针。 - 内存布局:数组指针本身占用一个指针大小的内存空间(通常在 32 位系统为 4 字节,64 位系统为 8 字节),它指向的数组在内存中是一块连续的内存区域,数组元素按顺序存储。
指针数组
- 定义:指针数组是一个数组,数组的每个元素都是一个指针。
- 声明方式:
type *array_name[array_size];
,例如int *arr[3];
表示arr
是一个包含 3 个int
类型指针的数组。 - 内存布局:指针数组本身占用
array_size
个指针大小的内存空间,每个指针可以指向不同的内存地址,这些地址所指向的数据在内存中不一定是连续的。
二维矩阵操作场景分析
使用数组指针更合适的情况
当二维矩阵的行数和列数在编译时就确定,并且矩阵的数据在内存中需要连续存储以提高缓存命中率,适合使用数组指针。例如,图像处理中固定尺寸的图像矩阵。
#include <iostream>
void processMatrixWithArrayPointer(int (*matrix)[3], int rows) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < 3; ++j) {
matrix[i][j] *= 2;
}
}
}
int main() {
int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
processMatrixWithArrayPointer(matrix, 2);
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
解释:这里 processMatrixWithArrayPointer
函数接受一个指向包含 3 个 int
的数组的指针,因为矩阵列数固定为 3 且数据连续存储,操作起来效率较高。
使用指针数组更合适的情况
当二维矩阵的行数在运行时确定,或者每行的长度可能不同时,适合使用指针数组。例如,存储不同长度字符串的二维数组。
#include <iostream>
void processMatrixWithPointerArray(int **matrix, int rows) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < i + 1; ++j) {
matrix[i][j] *= 2;
}
}
}
int main() {
int *matrix[3];
matrix[0] = new int[1];
matrix[1] = new int[2];
matrix[2] = new int[3];
matrix[0][0] = 1;
matrix[1][0] = 2; matrix[1][1] = 3;
matrix[2][0] = 4; matrix[2][1] = 5; matrix[2][2] = 6;
processMatrixWithPointerArray(matrix, 3);
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < i + 1; ++j) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
delete[] matrix[i];
}
return 0;
}
解释:processMatrixWithPointerArray
函数接受一个二级指针,因为每行长度不同,指针数组能灵活指向不同长度的内存区域。注意在使用完后需要手动释放内存。