C语言中,指针和数组是两个基础而又容易混淆的概念,特别是当它们结合在一起时。指向数组的指针,指向整个数组,可以访问数组的大小和所有元素。数组的指针,指向数组的第一个元素,可以通过指针逐个访问数组元素。通过这两种指针类型,我们可以灵活地操作数组数据,根据需要选择不同的方式来访问和处理数组。

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;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表