C语言深入理解数组指针及其应用

在C语言中,指针是一种强大的数据类型,可以用于处理数组。数组指针是指向数组的指针,它提供了一种便捷的方式来操作数组元素。本文将深入探讨数组指针的概念,以及它在实际应用中的用法。

1. 数组指针概念

首先,让我们回顾一下基本的指针概念。在C语言中,我们可以定义整型指针(int*)和字符指针(char*),它们分别用于存储整型和字符型变量的地址。而数组指针则是指向数组的指针,允许我们更灵活地处理数组类型的数据。

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (*p)[10] = &arr;

在上面的例子中,p 是一个指向包含10个整型元素的数组的指针。通过这个数组指针,我们可以更直接地操作整个数组。

2. 多维数组指针

数组指针同样适用于多维数组。例如,我们可以定义一个指向包含5个整型元素的一维数组的指针:

int arr[5] = {1, 2, 3, 4, 5};
int (*pa)[5] = &arr;

在这里,pa 是一个指向包含5个整型元素的数组的指针。这种多维数组指针的定义方式可以进一步扩展到更高维度的数组。

3. 数组指针的应用

3.1 遍历数组元素

使用数组指针,我们可以方便地遍历数组元素。例如,遍历一维数组:

for (int i = 0; i < 5; i++) {
    printf("%d ", (*pa)[i]);
    // 或者使用 pa 指针算术运算
    // printf("%d ", *(*pa + i));
}

3.2 处理多维数组

对于多维数组,数组指针提供了一种更清晰的方式来处理元素。例如,处理一个包含3行4列的二维数组:

int arr2D[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int (*p2D)[4] = arr2D;

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        printf("%d ", (*p2D)[j]);
        // 或者使用 p2D 指针算术运算
        // printf("%d ", *(*(p2D + i) + j));
    }
    p2D++; // 移动到下一行
}

4.示例演示

示例1

#include 

int main() {
    int* p = NULL;      // p是整型指针-指向整型的指针 - 可以存储整型地址
    char* pp = NULL;    // pp是字符指针-指向字符的指针 - 可以存储字符地址
                        // 数组指针 - 指向数组的指针 - 可以存储数组地址

    int arr[10] = {0};
    // arr - 首元素地址
    // arr[0] - 首元素地址
    // &arr - 数组地址

    int arr2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int (*pArr)[10] = &arr2;  // (*pArr)表示指针变量,指向包含10个整型元素的数组

    return 0;
}
  1. int* p = NULL; 定义了一个整型指针 p,并将其初始化为 NULL。这样的指针可以用于存储整型变量的地址。

  2. char* pp = NULL; 定义了一个字符指针 pp,同样初始化为 NULL。这个指针可以存储字符变量的地址。

  3. 数组指针的概念在注释中提到,但在实际代码中没有直接使用。

  4. int arr[10] = {0}; 定义了一个包含10个整型元素的数组 arr,并初始化所有元素为0。

  5. int arr2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 定义了另一个包含10个整型元素的数组 arr2,并初始化元素。

  6. int (*pArr)[10] = &arr2; 定义了一个指向包含10个整型元素的数组的指针 pArr,并将其指向 arr2 数组的地址。

示例2

#include 

int main() {
    int arr[10];
    int (*pp)[10] = &arr;

    char* arrChar[5];
    char* (*pa)[5] = &arrChar;
    // pa--指针变量名
    // * -- 指针
    // [5] -- pa指向的数组是5个元素
    // char* -- pa指向数组元素类型

    return 0;
}
  1. int arr[10]; 定义了一个包含10个整型元素的一维数组 arr

  2. int (*pp)[10] = &arr; 定义了一个指向包含10个整型元素的一维数组的指针 pp,并将其指向数组 arr 的地址。这样的数组指针可以用于方便地访问整个一维数组。

  3. char* arrChar[5]; 定义了一个包含5个字符指针的一维数组 arrChar

  4. char* (*pa)[5] = &arrChar; 定义了一个指向包含5个字符指针的一维数组的指针 pa,并将其指向数组 arrChar 的地址。这是一个演示二维数组指针的例子,其中 pa 是指向数组元素类型为 char* 的指针,该数组有5个元素。

  5. 注释部分提供了对数组指针 pa 的解释:

    • pa 是指针变量名。
    • * 表示指针。
    • [5] 表示 pa 指向的数组有5个元素。
    • char* 表示 pa 指向的数组的元素类型为字符指针。

示例3

#include 

int main() {
    int arr[5] = {1, 2, 3, 4, 5};

    int(*pa)[5] = &arr;
    for (int i = 0; i < 5; i++) {
        // printf("%d\t", (*pa)[i]);// 打印pa指向的第i个元素
        // printf("%d\t", *(*pa + i)); // *pa + i == arr + i
    }

    int arr2[5] = {1, 2, 3, 4, 5};
    int* p = arr2;
    for (int i = 0; i < 5; i++) {
        printf("%d ", *(p + i)); // 打印指针p偏移i后的元素值
    }

    return 0;
}
  1. int arr[5] = {1, 2, 3, 4, 5}; 定义了一个包含5个整型元素的一维数组 arr

  2. int(*pa)[5] = &arr; 定义了一个指向包含5个整型元素的一维数组的指针 pa,并将其指向数组 arr 的地址。注释中的两种打印方式都是合法的,分别演示了通过指针和指针算术运算访问数组元素。

  3. int arr2[5] = {1, 2, 3, 4, 5}; 定义了另一个包含5个整型元素的一维数组 arr2

  4. int* p = arr2; 定义了一个指向整型的指针 p,并将其指向数组 arr2 的首元素地址。在循环中使用指针算术运算打印数组元素的值。

总体而言,这段代码演示了如何使用一维数组指针和指针来遍历一维数组,并通过指针算术运算方便地访问数组元素。

你可能感兴趣的:(算法)