1、指向数组的指针(Pointer to an Array)
指向数组的指针是指向整个数组的指针,而不是指向数组中的单个元素。它指向的是数组的第一个元素,并且它的类型是指向该数组的指针。
#include <stdio.h>
int main() {
    int arr[3] = {1, 2, 3};
    int (*ptr)[3] = &arr;  // 指向一个包含3个整数的数组的指针
    printf("%d\n", (*ptr)[0]);  // 输出 1
    printf("%d\n", (*ptr)[1]);  // 输出 2
    printf("%d\n", (*ptr)[2]);  // 输出 3
    
    return 0;
}
2、数组的指针(Array of Pointers)
数组的指针是一个数组,其中每个元素是一个指向某些数据类型的指针。可以将它视为指针的集合。
#include <stdio.h>
int main() {
    int *arr[3];  // 一个包含 3 个指向整数的指针的数组
    int a = 10, b = 20, c = 30;
    arr[0] = &a;
    arr[1] = &b;
    arr[2] = &c;
    // 输出每个指针所指向的值
    printf("%d\n", *arr[0]);  // 输出 10
    printf("%d\n", *arr[1]);  // 输出 20
    printf("%d\n", *arr[2]);  // 输出 30
    return 0;
}
3、区别总结
指向数组的指针 是指向整个数组的指针。int (*ptr)[3],ptr 是指向包含 3 个整数的数组的指针,解引用后获取的是整个数组,可以使用数组下标来访问每个元素。访问方式,(*ptr)[0],(*ptr)[1],(*ptr)[2]。
数组的指针 是一个数组,每个元素都是指向特定数据类型的指针。int *arr[3],arr 是一个数组,包含 3 个指向整数的指针。每个元素是一个指针,指向整数值。访问方式,*arr[0],*arr[1],*arr[2]。
#include <stdio.h>
int main() {
    // 指向数组的指针
    int arr[5] = {1, 2, 3, 4, 5};
    int (*p)[5] = &arr;  // p 是指向具有 5 个元素的数组的指针
    
    printf("指向数组的指针: p[0][2] = %d\n", (*p)[2]); // 通过指向数组的指针访问元素
    // 数组元素的指针
    int *q = arr;  // q 是指向数组第一个元素的指针
    
    printf("数组元素的指针: q[2] = %d\n", q[2]); // 通过指向元素的指针访问元素
    return 0;
}