C语言指针数组与数组指针详解

需积分: 10 7 下载量 25 浏览量 更新于2024-09-11 1 收藏 120KB DOC 举报
"数组指针和指针数组是C语言中两个重要的概念,它们在内存布局和使用上有显著差异。理解这两个概念对于深入学习C语言至关重要。本文将详细讲解它们的区别。 一、指针数组和数组指针的内存布局 1. 指针数组:指针数组实际上是一个数组,数组的每个元素都是一个指针。数组的大小由数组本身决定,每个元素可以指向不同类型的变量。例如,`int *p1[10]`定义了一个包含10个指向整型数据的指针的数组。 2. 数组指针:数组指针是一个指针变量,它指向一个完整的数组。在32位系统中,数组指针通常占用4个字节,但它所指向的数组大小未知。例如,`int(*p2)[10]`定义了一个指针,该指针指向一个包含10个整型元素的数组。 二、int(*)[10]p2——数组指针的正确定义 在定义数组指针时,通常会看到如`int(*)[10] p2`这样的形式,这实际上是将指针类型`int(*)[10]`与指针变量名`p2`分开写,使得代码更易读。这种写法并不影响其含义,数组指针仍指向一个包含10个整型元素的数组。 三、a和&a的区别 在C语言中,`a`和`&a`代表不同的东西。`a`是数组的名称,它在表达式中会退化为指向数组首元素的指针。而`&a`是整个数组的地址,是一个指向数组起始位置的指针。因此,当我们将`a`赋值给一个数组指针时,如`char(*p4)[5]=a;`,实际上是在将数组的首元素地址赋给`p4`,而不是整个数组的地址。相反,`char(*p3)[5]=&a;`正确地将整个数组的地址赋给了`p3`。 四、指针移动 对于数组指针,`p3+1`和`p4+1`的结果不同。由于`p3`指向整个数组,`p3+1`会指向数组的下一个位置,即下一个相同大小的数组区域。然而,`p4`只指向数组的首元素,因此`p4+1`将指向数组的下一个元素。在本例中,`p3+1`将指向`a`数组之后的内存区域,而`p4+1`将指向`a[1]`。 总结: 数组指针和指针数组虽然在名称上相似,但它们在内存布局和使用上有本质的不同。理解这些差异对于正确地操作内存和编写高效C语言代码至关重要。在实际编程中,应特别注意`a`和`&a`的区别,以及如何正确地使用数组指针进行数组操作。