面试题答案
一键面试数组指针和指针数组的区别
-
定义:
- 数组指针:是一个指针,它指向一个数组。即该指针存储的是整个数组的首地址。其定义形式为
类型 (*指针变量名)[数组长度]
,例如int (*p)[10];
,这里p
是一个指向含有10个int
类型元素的数组的指针。 - 指针数组:是一个数组,数组中的每个元素都是指针。其定义形式为
类型 *数组名[数组长度]
,例如int *p[10];
,这里p
是一个数组,数组中有10个int
型指针。
- 数组指针:是一个指针,它指向一个数组。即该指针存储的是整个数组的首地址。其定义形式为
-
内存布局:
- 数组指针:只占用一个指针的内存空间(通常在32位系统是4字节,64位系统是8字节),它指向一块连续的数组内存区域。
- 指针数组:占用的内存空间是数组元素个数乘以指针类型的大小。例如,对于
int *p[10];
,若指针占4字节(32位系统),则该数组占用40字节,数组中的每个指针可以指向不同的内存区域。
-
运算:
- 数组指针:对数组指针进行
+1
操作,指针移动的距离是整个数组的大小。例如,对于int (*p)[10];
,p + 1
移动的字节数为10 * sizeof(int)
。 - 指针数组:对指针数组的元素(指针)进行
+1
操作,移动的距离是其所指向类型的大小。例如,对于int *p[10];
,p[0]+1
移动的字节数为sizeof(int)
。
- 数组指针:对数组指针进行
代码示例
#include <stdio.h>
// 数组指针示例
void arrayPointerExample() {
int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
int (*p)[4] = arr; // 定义数组指针,指向一个含有4个int元素的数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", *(*(p + i)+j));
}
printf("\n");
}
}
// 指针数组示例
void pointerArrayExample() {
int a = 10, b = 20, c = 30;
int *p[3] = {&a, &b, &c}; // 定义指针数组
for (int i = 0; i < 3; i++) {
printf("%d ", *p[i]);
}
printf("\n");
}
管理不同长度字符串的二维数组
对于每一行存储不同长度字符串的二维数组,使用指针数组更合适。理由如下:
- 灵活性:指针数组中的每个指针可以指向不同长度的字符串,更符合需求。而数组指针指向的数组长度是固定的,难以满足不同长度字符串的存储。
- 内存使用效率:指针数组可以为每个字符串分配恰好所需的内存,避免了数组指针可能造成的内存浪费(如果使用数组指针,可能需要按最长字符串的长度来定义数组,会浪费大量内存)。
代码示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void manageStrings() {
char *strings[3];
strings[0] = "hello";
strings[1] = "world";
strings[2] = "c programming";
for (int i = 0; i < 3; i++) {
printf("%s\n", strings[i]);
}
}
在上述代码中,strings
是一个指针数组,每个元素指向一个不同长度的字符串。通过这种方式,可以高效地管理和访问不同长度的字符串。