面试题答案
一键面试指针方式遍历并输出
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
for (int i = 0; i < 5; i++) {
printf("%d ", *(ptr + i));
}
return 0;
}
下标方式遍历并输出
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
指针和下标转换原理
在C语言中,数组名在大多数情况下会被隐式转换为指向数组首元素的指针。例如 int arr[5]
,arr
就代表数组首元素的地址,和 &arr[0]
等价。
当使用指针 int *ptr = arr;
时,*(ptr + i)
表示访问从 ptr
开始偏移 i
个元素位置的内容。因为指针算术运算中,指针加上一个整数 n
,其实际偏移量是 n
乘以指针所指向数据类型的大小(这里 int
类型大小通常为4字节)。
而下标方式 arr[i]
本质上和 *(arr + i)
是等价的。编译器在处理 arr[i]
时,会将其转换为指针偏移的形式 *(arr + i)
来访问数组元素。也就是说,下标方式其实是基于指针偏移的一种语法糖,让代码在访问数组元素时更加直观和方便。