面试题答案
一键面试指针数组
- 定义:指针数组是一个数组,数组的每个元素都是指针类型。其定义形式为
数据类型 *数组名[数组大小];
例如int *ptr_array[5];
,这里定义了一个名为ptr_array
的指针数组,它有5个元素,每个元素都是指向int
类型的指针。 - 实际应用场景:
- 字符串管理:常用于管理一组字符串。例如:
#include <stdio.h>
int main() {
char *strs[] = {"apple", "banana", "cherry"};
for (int i = 0; i < 3; i++) {
printf("%s\n", strs[i]);
}
return 0;
}
在这个例子中,strs
是一个指针数组,每个元素指向一个字符串常量。这样可以方便地对多个字符串进行操作,如排序、查找等。
- 函数指针数组:可以用于实现函数表。例如:
#include <stdio.h>
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int main() {
int (*func_ptr_array[])(int, int) = {add, subtract};
int result1 = func_ptr_array[0](3, 2);
int result2 = func_ptr_array[1](3, 2);
printf("Add result: %d\n", result1);
printf("Subtract result: %d\n", result2);
return 0;
}
这里 func_ptr_array
是一个函数指针数组,每个元素指向一个函数,通过数组索引可以方便地调用不同的函数。
数组指针
- 定义:数组指针是一个指针,它指向一个数组。其定义形式为
数据类型 (*指针名)[数组大小];
例如int (*ptr)[5];
,这里ptr
是一个指向包含5个int
类型元素的数组的指针。 - 实际应用场景:
- 二维数组操作:在处理二维数组时非常有用。例如:
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int (*ptr)[4] = arr;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", *(*(ptr + i) + j));
}
printf("\n");
}
return 0;
}
这里 ptr
是一个数组指针,指向二维数组 arr
的第一行。通过这种方式可以更方便地对二维数组进行遍历和操作。
- 传递二维数组给函数:在函数参数传递中,当需要传递二维数组时,可以使用数组指针作为参数。例如:
#include <stdio.h>
void print_array(int (*ptr)[4], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", *(*(ptr + i) + j));
}
printf("\n");
}
}
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
print_array(arr, 3);
return 0;
}
在 print_array
函数中,使用数组指针 ptr
来接收二维数组,使得函数能够正确处理二维数组的数据。
区别
- 本质:指针数组本质是数组,数组元素为指针;数组指针本质是指针,指向一个数组。
- 定义形式:指针数组是
数据类型 *数组名[数组大小];
,数组指针是数据类型 (*指针名)[数组大小];
,注意括号的位置不同。 - 运算:指针数组名代表整个数组的起始地址,数组名 + 1 移动的是一个指针类型的大小(通常是4或8字节,取决于系统);数组指针名代表指向的数组的起始地址,指针名 + 1 移动的是所指向数组的大小,比如指向
int [5]
的指针,指针 + 1 移动的是5 * sizeof(int)
字节。