前言
上一篇文章介绍了字符指针,这篇来介绍指针数组和数组指针。
1.指针数组
指针数组就是一个存放指针的数组。[]表示指针运算符,在上一篇文章已经补充过这一点知识。
int a[5] = { 1,2,3,4,5 };
int b[] = { 0,1,2,3,4,5 };
int c[] = { 3,44,5,6,7 };
int* arr[3] = { a,b,c };//指针数组
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
//printf("%d ", *(arr[i] + j));
printf("%d ", arr[i][j]);// []表示指针运算符,用来计算指针加上或减去一个整数后所指向的地址。例如,p[0]等价于*p,p[1]等价于*(p+1)
}
printf("\n");
}
指针数组常常定义为下面的形式:
int* arr1[1]; //整形指针的数组
char *arr2[2]; //一级字符指针的数组
char **arr3[3];//二级字符指针的数组
指针数组是一个数组,存放的指针是以数组名前面的如int* 、char*为类型的指针,定义的方式很简单。
2.数组指针
2.1数组指针的定义
与指针数组不同的是,数组指针是一个指针,而不是数组。那么什么是数组指针呢? int* pi是一个指向整型数据的指针,char* pc是一个指向字符的指针,那么数组指针就是一个指向数组的指针。那么怎么定义一个数组指针呢?
int *p1[10];
int (*p2)[10];
//p1, p2分别是什么?
解释:由上面指针数组的介绍可知,p1是一个指针数组,装着指针的数组,p1会先于[]结合,[]优先级高于 * ;p2先和 * 结合,说明p2是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p2是一个指针,指向一个数组,叫数组指针。
注意:[]的优先级要高于 * 号的,所以必须加上()来保证p先和*结合。优先级顺序:()>[]> *
数组名 和 &数组名
数组名表示首元素地址,但有两个例外
- sizeof(arr),整个数组的大小,单位为字节
- &arr 表示整个数组的地址
int arr[10] = { 0 };
int(*p)[10] = &arr;
printf("%p\n", *p);
printf("%p\n", *p + 1);
printf("%p\n", &arr);
printf("%p\n", &arr+1);
printf("%p\n", arr);
printf("%p\n", arr+1);
打印结果如下:
根据上面的代码和结果就可以发现,&arr和arr,虽然值是一样的,但意义不一样。实际上,&arr 表示的是数组的地址,而不是数组首元素的地址。&arr 的类型是: int( * )[10] ,是一种数组指针类型,地址+1,跳过整个数组的大小,所以 &arr+1相对于&arr的差值是10*4=40。
2.2数组指针的使用
下面介绍一下数组指针的常用方式和二维数组的简单打印方式:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8 };
int(*p)[10] = &arr;
int i;
for (i = 0; i < 10; i++)
{
printf("%d ", *((*p) + i));
}
return 0;
}
void print1(int arr[3][5], int a, int b)
{
int i, j;
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print2(int(*p)[5], int a, int b)
{
int i,j;
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++)
{
printf("%d ", *((*p + i) + j));
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,1,2}, {1,1,1,1,1}, {2,3,4,2,3} };
print1(arr, 3, 5);
//二维数组的数组名代表的是一个指向行的指针,也就是指向二维数组第一行的地址。
print2(arr, 3, 5);
return 0;
}
结果如下:
由结果可知这两种打印方式都可以,
3.总结
最后来看一个指针数组与数组指针的联合使用,检查一下自己的学习情况、
int (*parr[10])[5];
解释:parr是一个存储数组指针的数组,该数组能够存放十个数组指针,每个数组指针能够指向一个数组,每个数组有五个元素,每个元素为int类型。
指针数组就是一个存放指针的数组,数组指针是一个指向数组的指针。在我们使用指针数组和数组指针的时候,难免会涉及到传参的知识,传参将在下篇文章介绍,感兴趣的可以看下篇文章。