//指针数组和数组指针分析
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[8][8] = {1,2,3,4};
int (*ptr1)[8] = a ;
int (*ptr2)[8][8] = &a;
int *ptr3 = &a[0][0];
printf(" &a[0][0] = %#x
" , &a[0][0]); //指向数组的第一个元素的地址
printf(" ptr1 = %#x
" , ptr1); //A、指向一纬数组第一个元素首部
printf(" &a[0] = %#x
" , &a[0]); //同上A
printf(" ptr1+1 = %#x
" , ptr1+1); //B、指向一纬数组第二个元素首部 = A+4*8
printf(" &a[0]+1 = %#x
" , &a[0]+1); //同上B
printf(" ptr2 = %#x
" , ptr2);
printf(" &a = %#x
" , &a);
printf(" ptr2+1 = %#x
" , ptr2+1);
printf(" &a+1 = %#x
" , &a+1);
//ptr2的解释就是:一个指向二维数组[8][8]的指针,
//那么ptr2+1则是偏移了一个二维数组[8][8]的地址,即为4*8*8=256(0x100)个字节的偏移
printf(" ptr3 = %#x
" , ptr3);
printf(" &a[0][0] = %#x
" , &a[0][0]);
printf(" ptr3+1 = %#x
" , ptr3+1);
printf(" &a[0][0]+1 = %#x
" , &a[0][0]+1);
//int *ptr3 = &a[0][0];这个毫无疑问,是将数组a的首元素地址赋给指针ptr3,
//由于是int型数组,那么ptr3+1则是偏移一个int型大小,即偏移4个字节.
return 0;
}
//结果是:
/*
&a[0][0] = 0x28fde4
ptr1 = 0x28fde4
&a[0] = 0x28fde4
ptr1+1 = 0x28fe04
&a[0]+1 = 0x28fe04
ptr2 = 0x28fde4
&a = 0x28fde4
ptr2+1 = 0x28fee4
&a+1 = 0x28fee4
ptr3 = 0x28fde4
&a[0][0] = 0x28fde4
ptr3+1 = 0x28fde8
&a[0][0]+1 = 0x28fde8
*/