联系
- 在C语言中,数组名在大多数表达式中会被自动转换为指向数组首元素的指针。例如,
int arr[5];
,在很多情况下arr
就相当于&arr[0]
,是一个指针常量。
- 可以使用指针算术运算来访问数组元素,也可以使用数组下标法访问指针指向的内存区域,这两种方式在很多场景下是等效的。
区别
- 本质不同:数组是一块连续的内存区域,用于存储多个相同类型的数据,其大小在编译时就确定。而指针是一个变量,存储的是一个内存地址。
- 内存分配方式:数组的内存是静态分配(在栈上或全局数据区,取决于定义位置),而指针所指向的内存可以是动态分配(如使用
malloc
等函数)。
- 可修改性:数组名作为指针常量,其值不能被修改。例如
int arr[5]; arr++;
是错误的。而普通指针变量的值可以修改,指向不同的内存地址。
通过指针访问数组元素
#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>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
return 1;
}
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1; // 用数组表示法给指针指向的内存区域赋值
}
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // 用数组表示法访问指针指向的内存区域
}
free(ptr);
return 0;
}