在C语言中,指针是一个强大且灵活的工具,它能以多种方式操纵和访问内存。理解指针在数组中的应用对编写高效和可维护的代码至关重要。今天我们将探讨两个容易混淆的概念:数组指针和指针数组。
1. 数组指针(Pointer to an Array)
数组指针是指向整个数组的指针。假设有一个数组int arr[5]
,那么int (*p)[5]
就是一个指向该数组的指针。这个指针保存的是数组的起始地址,同时知道数组的大小。
示例代码:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr; // p 是指向整个数组的指针
// 使用数组指针访问数组元素
printf("Array elements using array pointer:\n");
for(int i = 0; i < 5; i++) {
printf("%d ", (*p)[i]);
}
printf("\n");
return 0;
}
结果:
Array elements using array pointer:
1 2 3 4 5
解析:
int (*p)[5]
定义了一个指向包含5个整数的数组的指针。p
保存的是整个数组的地址,而(*p)[i]
则访问数组中的元素。
2. 指针数组(Array of Pointers)
指针数组是一个由指针组成的数组。每个数组元素都是一个指针,它们可以指向不同的数据类型或内存位置。
示例代码:
#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3;
int *arr[3]; // 定义了一个包含3个指针的数组
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
// 使用指针数组访问数据
printf("Values using array of pointers:\n");
for(int i = 0; i < 3; i++) {
printf("%d ", *arr[i]);
}
printf("\n");
return 0;
}
结果:
Values using array of pointers:
1 2 3
解析:
int *arr[3]
定义了一个包含三个整数指针的数组。arr[0]
,arr[1]
,arr[2]
分别指向a
,b
,c
的地址。- 使用
*arr[i]
可以访问每个指针指向的值。
总结
- 数组指针指向一个数组,并可以通过
(*p)[i]
方式访问数组中的元素。 - 指针数组则是一个存放多个指针的数组,每个指针可以指向不同的内存地址。