一、数组名、sizeof(数组名)、&数组名的关系
数组名 —— 一般指数组首元素的地址
sizeof( 数组名 ) —— 数组名表示整个数组,计算的是整个数组的大小
&数组名 —— 取出的是整个数组的地址,计算的是整个数组的大小
二、使用指针打印一维数组
1、首先,int *p = arr ; 这里的arr是数组的首元素地址,那么p + i 就是 arr [ 0 + i ]
2、由此可得,arr [ i ] <==> *( p + i )
3、那么就有了以下的打印方式
int main()
{
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = arr;
printf("1: %d \n", arr[2]);
printf("2: %d \n", *(arr + 2));
printf("3: %d \n", *(p + 2));
printf("4: %d \n", *(2 + p));
printf("5: %d \n", *(2 + arr));
printf("6: %d \n", 2 [arr]);
printf("7: %d \n", p[2]);
printf("8: %d \n", 2[p]);
}
1、arr[2] —— 直接打印下标为2的元素 —— 打印3
2、*( arr + 2 ) —— arr为数组首元素的地址 ,+ 2 便指向了下标为2的元素 —— 打印3
3、*( p + 2 ) —— p指向了arr的首元素地址,+ 2 便指向了下标为2的元素 —— 打印3
4、*( 2 + p ) —— 同理,p指向了arr首元素的地址,2 + p也是指向了下标为2的元素 —— 打印3
5、*( 2 + arr ) —— arr为首元素地址,2 + arr则会跳到下标为2元素的地址,解引用之后 —— 打印3
6、2 [ arr ] —— 与arr[ 2 ] 相同,会被转换成*( 2 + arr ),解引用之后 —— 打印3
7、p [ 2 ] —— 会被转化为 *( p + 2 ), 解引用之后 —— 打印3
8、2 [ p ] —— 同上
结论:以上打印方法完全相等.
三、使用指针打印二维数组
理解以上知识点之后,那么二维数组的打印就可以这样
int main()
{
int arr[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
printf("%d\n", arr[1][1]);
printf("%d\n", *(*(arr + 1) + 1));
}
1、*(*(arr + 1) + 1) —— 首先,arr是数组第一行的地址 ,+1就跳过一行,指向第二行,解引用得到第二行第一个元素的地址,再+1得到第二行第二个元素的地址,解引用之后打印出7
结论:arr[ 1 ] [ 1 ] <==> * ( * ( arr + 1 ) + 1)