一、数组指针与指针数组
1、数组指针与指针数组的定义
-
1)数组指针
- 数组指针是一个可以指向数组的指针,其大小是4个字节;(地址的长度是32位 = 4B)
例如:int (*p1)[5];
【注】根据平时定义变量的形式(数据类型 + 变量名),可以这样来理解数组指针:int (*)[5]p1,int (*)[5]是指针类型,p2是指针变量;
-
2)指针数组
- 指针数组是包含多个指针的数组,若数组元素是n,则大小是4n个字节;
例如:int *p2[5];
【注】p2中有5个元素,每个元素都是一个int类型的指针;
2、数组指针与数组元素对应关系
-
假设:
-
p = &a = *p = a
,**p = (*p)[0] = a[0] = a
;
【注】
-
因此
char (*p)[5] = &a;
不能写成char (*p)[5] = a;
尽管&a
和a
的值相同;
char a[5] = {'a', 'c', 'e', 'g'}; char (*p)[5] = &a;
&a
表示数组的首地址,
a
表示数组第一个元素的地址;同理
p
和
*p
的含义也不相同;
3、使用数组指针遍历二维数组
#include <stdio.h>
int main(void)
{
int a[3][2] = {1, 3, 5, 7, 9, 11};
int (*p)[2] = &a[0];
int i = 0, j = 0;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 2;j++)
{
printf("a[i][j] = %d, ", a[i][j]);
printf("*(*(p+i)+j) = %d, ", *(*(p+i)+j));
printf("(*(p+i))[j] = %d\n", (*(p+i))[j]);
}
}
return 0;
}
【注】a[i][j] = *(*(p+i)+j) = (*(p+i))[j] ≠ *(p+i)[j] 或 **(p+i)+j
-
分析:
-
a.
*(p+i)[j] = *(p+i+j) = a[i+j][0]
因为*
的优先级不如[]
; -
b.
**(p+i)+j = a[i][0]+j