【C语言】指针数组和数组指针
前言
指针数组和数组指针是C语言中经常混淆的两个概念,虽然他们的名字相似,但其含义却完全不同。
指针数组
指针数组本质是一个数组,特点是数组中的元素均为指针,其定义形式为:
数据类型 *指针名[长度]
例如
int *ptr[5];
这是一个包含5个元素的数组,每个元素都是指向int类型的指针
示例代码
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int c = 30;
int *ptr[3]; // 声明一个包含3个元素的指针数组
/*分别给数组的三个元素赋值,值分别为abc的地址*/
ptr[0] = &a;
ptr[1] = &b;
ptr[2] = &c;
for (int i = 0; i < 3; i++) {
printf("ptr[%d]: %d", i, *ptr[i]);
}
return 0;
}
数组指针
数组指针本质是一个指针,但它指向的是一个数组。其定义形式为:
数据类型 (*指针名)[长度]
例如
int (*ptr)[5];
这是一个指向包含5个int类型元素的数组的指针
示例代码
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr; // 声明一个指向包含5个int类型元素的数组的指针
for (int i = 0; i < 5; i++) {
printf("Element %d: %d ", i, (*ptr)[i]);
}
printf("
");
return 0;
}
区别总结
- 指针数组:是一个数组,其元素都是指针。例如,
int *ptr[5];
表示一个包含5个元素的数组,每个元素都是指向int
类型的指针。 - 数组指针:是一个指针,它指向一个数组。例如,
int (*ptr)[5];
表示一个指向包含5个int
类型元素的数组的指针。
其实我们在大多数情况下,很少使用数组指针,因为数组指针的定义形式不如直接用int a[5]更为方便;但指针数组却在需要储存多个地址的时候经常被用到,例如字符串和二维数组。
示例程序
#include <stdio.h>
int main() {
const char *strArray[] = {"Hello", "World", "Pointer", "Array"};
const char **ptr;
// 将指针数组指向字符串数组的每一个元素
for (int i = 0; i < 4; i++) {
ptr = &strArray[i]; // ptr现在指向strArray的第i个字符串
printf("String at strArray[%d]: %s\n", i, *ptr);
}
return 0;
}
其输出结果是
Hello
World
Pointer
Array
在这个例子中,strArray
是一个包含4个字符串的数组。ptr
是一个指向char
类型的指针的指针(即指向字符串的指针)。通过循环,我们将ptr
依次指向字符串数组的每一个元素,然后通过*ptr
访问每一个字符串。
- 指针数组在二维数组中的应用:通过指针数组可以方便地访问和操作二维数组中的元素。例如,
int (*ptr)[4]
可以指向二维数组的每一行,从而通过(*ptr)[j]
访问具体的元素。 - 指针数组在字符串中的应用:通过指针数组可以方便地访问和操作字符串数组中的每一个字符串。例如,
const char **ptr
可以指向字符串数组的每一个元素,从而通过*ptr
访问具体的字符串。