指针数组和数组指针
数组指针、指针数组
数组名是地址,与数组首元素地址仅代表自己类型那么大内存不同,数组名内存指向能力非常强。数组名指向整个数组空间。进一步讲,对数组名取地址,即就是在对整个数组取地址,则数组的地址自然要用指向数组的指针才能接收,所以,必须定义指向数组的指针类型,即为数组指针。见代码
#include <stdio.h>
int main()
{
int ar[10] = { 1,2,3,4,5,6,7,8,9,10 };
int *p = ar;
/*下面是错误代码
int **p = &ar;*/
//正确写法
int(*pp)[10] = &ar;
getchar();
return 0;
}
int *p = ar; p的类型int *,p指向的类型int
int **p = &ar; p的类型int** ,p指向的类型int*
int ar[10]的类型,int[10]
int(*pp)[10] = &ar;pp的类型是 int (*)[10],pp指向int
在C语言中,指针和数组是两个非常重要的概念,它们之间存在紧密的联系。数组名实际上是一个常量指针,它总是指向数组的第一个元素。理解这种关系对于编写高效的C程序至关重要。
我们来看一下标题中提到的“指针数组”和“数组指针”。指针数组是一个数组,其每个元素都是一个指针,可以存储多个指针值。例如,`int *ptr[10]` 是一个包含10个`int`类型的指针的数组。而数组指针,也称为指向数组的指针,是一个指针变量,它存储的是一个数组的地址,而不是单个元素的地址。比如,`int (*ptr)[10]` 是一个指向包含10个`int`元素的数组的指针。
描述中的代码示例展示了如何正确地处理数组和指针的关系:
```c
int ar[10] = { 1,2,3,4,5,6,7,8,9,10 };
int *p = ar; // 正确,p指向数组ar的第一个元素
// int **p = &ar; // 错误,p的类型不匹配,应该是一个指向数组的指针
int (*pp)[10] = &ar; // 正确,pp是一个指向包含10个int的数组的指针
```
在这里,`int *p = ar;` 定义了一个`int`类型的指针`p`,它被初始化为数组`ar`的第一个元素的地址。然而,尝试将数组名`ar`赋值给`int **p`是错误的,因为`ar`代表的是整个数组的地址,而不是一个`int`指针的地址。正确的做法是定义一个`int (*)[10]`类型的指针`pp`,并用`&ar`来初始化它,这样`pp`就指向了整个数组`ar`。
在C语言中,数组名和指针之间的转换是自动进行的,这使得可以通过指针访问数组的元素。但是,需要注意的是,虽然数组名可以隐式转换为指向第一个元素的指针,但不能将数组名直接赋值给一个指向指针的指针,因为数组名并不等同于一个简单的指针。
总结来说,指针和数组在C语言中是相互关联的概念,数组名可以被视为指向数组第一个元素的指针,而数组指针则可以用来存储整个数组的地址。正确理解和运用这两个概念可以帮助编写出更加灵活和高效C程序。