首页 > 编程笔记 > C语言笔记

C语言指针数组和数组指针的区别(附带示例)

在C语言中,指针数组和数组指针是两个容易混淆的概念,虽然它们的名称看起来相似,但它们有着本质的区别。

指针数组

指针数组的本质是一个数组,其中每个元素都是指针。换句话说,指针数组是一个存储指针的数组。这种数组可以用来存储多个指向不同数据类型的指针,如整型指针、字符指针等。指针数组的主要用途是管理多个指针,例如存储多个字符串(字符指针数组)或管理多个动态分配的内存块。


指针数组的声明语法如下:

数据类型 *数组名[数组大小];

这里,数据类型指定了指针所指向的数据类型,数组名是我们给这个指针数组起的名字,数组大小则指定了数组可以存储多少个指针。


例如,我们可以创建一个整型指针数组:

int *ptr_array[5];

这行代码声明了一个包含 5 个元素的数组,每个元素都是一个指向整数的指针,我们可以使用这个数组来存储 5 个不同整数的地址。
 

让我们看一个具体的例子来更好地理解指针数组:

#include <stdio.h>

int main() {
    int a = 10, b = 20, c = 30, d = 40, e = 50;
    int *ptr_array[5] = {&a, &b, &c, &d, &e};

    for (int i = 0; i < 5; i++) {
        printf("Value at ptr_array[%d] = %d\n", i, *ptr_array[i]);
    }

    return 0;
}

输出结果:

Value at ptr_array[0] = 10
Value at ptr_array[1] = 20
Value at ptr_array[2] = 30
Value at ptr_array[3] = 40
Value at ptr_array[4] = 50

在这个例子中,我们创建了一个指针数组,并将它初始化为指向五个不同的整数。然后,我们通过循环遍历数组,并打印每个指针所指向的值。

数组指针

数组指针的本质是一个指针,它指向一个数组。注意,数组指针是将数组作为一个整体来指向的,而不是指向其中的某个元素。
 

数组指针通常用于在函数间传递多维数组,特别是在处理二维数组时非常有用。使用数组指针可以更有效地操作大型数组,因为它避免了数组的复制,只传递了数组的地址。


数组指针的声明语法如下:

数据类型 (*指针名)[数组大小];

在这个语法中,数据类型指定了数组元素的类型,指针名是我们给这个数组指针起的名字,数组大小指定了指针所指向的数组的大小。
 

注意,括号是必须的,因为它改变了运算符的优先级;如果没有括号,就变成了上面说的指针数组。


例如,我们可以声明一个指向包含 5 个整数的数组的指针:

int (*ptr)[5];

这行代码声明了一个指针 ptr,它指向一个包含 5 个整数的数组。让我们通过一个例子来更好地理解数组指针:

#include <stdio.h>

int main() {
    int arr[3][5] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15}
    };
    int (*ptr)[5] = arr;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

输出结果:

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 

在这个例子中,我们创建了一个 3x5 的二维数组,然后声明了一个数组指针 ptr 并将其初始化为指向这个二维数组的第一行。通过使用数组指针,我们可以像使用原始数组一样访问二维数组的元素。


理解数组指针的关键在于认识到它指向的是整个数组,而不是单个元素。这意味着当我们对数组指针进行算术运算时,它会以整个数组的大小为单位进行移动。例如,如果 p 是一个指向 int[4] 的指针,那么 p+1 会让指针向前移动 4 个 int 的大小,而不是 1 个 int 的大小。

指针数组和数组指针的区别

现在让我们对比指针数组和数组指针的关键区别:

 

总之,要想理解指针数组和数组指针的区别,关键在于记住:指针数组说的是数组中的每个元素都是指针,而数组指针是指向数组的指针(将数组作为一个整体来指向,而不是指向其中某个元素)。这种区别虽然微妙,但在实际编程中却很重要,因为它们的内存布局和使用方式都有所不同。

相关文章