数组指针
数组指针是指向一个数组的指针。在C语言中,数组名在大多数情况下会退化为指向其首元素的指针,但这并不直接等同于数组指针。一个真正的数组指针是指向一个固定大小的数组类型的指针。然而,C语言标准并不直接支持指向未知大小的数组的指针(除了通过指针和长度参数手动管理,如字符串和malloc
分配的内存那样)。但是,你可以通过指向具有已知大小的数组类型的指针来模拟这一行为。
数组指针的使用
假设我们有一个二维数组 int a[3][4];
,我们可以这样使用数组指针:
#include <stdio.h>
int main() {
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 将数组名作为指针使用
int (*p)[4] = a; // p 是一个指向 int[4] 的指针,指向第一行的首地址
// 使用数组指针访问元素
printf("%d\n", *(*(p + 1) + 2)); // 输出第二行第三列的值,即7
// 使用数组名和下标访问元素
printf("%d\n", a[1][2]); // 也是输出7
return 0;
}
解释
int (*p)[4] = a;
: 这里p
是一个指向整型数组(每个数组有4个元素)的指针。a
是数组名,指向数组的第一个元素(即a[0]
的首地址)。*(*(p + 1) + 2)
: 这里p + 1
移动指针到第二行的首地址(即a[1]
的首地址)。然后*(p + 1)
解引用指针,获取第二行的首地址。最后+ 2
进行索引操作,访问第二行第三列的元素。
数组指针的运算
p[n]
: 访问第n
行的首地址。*(p + n)
: 也是访问第n
行的首地址。*(p[n] + m)
: 访问第n
行第m
列的元素。
示例:输出二维数组任意行列的数
#include<stdio.h>
void inputArr(int *pm,int *pn)
{
printf("请输入行列值:\n");
scanf("%d%d",pm,pn);
}
int getData(int (*p)[4],int row,int list) //定义了一个数组指针用来接收arr
{
int data;
data = *(*(p+row)+list);
return data;
}
int main()
{
int row,list;
int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int data;
inputArr(&row,&list); //保证调用的函数内的操作可以保留在main函数中,传递地址作为参数
data = getData(arr,row,list);
printf("%d行%d列的值是:%d",row,list,data);
return 0;
}