//理解数组指针与指针数组要从定义开始,对于优先级的理解
//对于形如 int* p[4],那么他就是个指针数组。因为先定义数组
//对于形如int (*p)[4],就是个数组指针,因为先定义指针。 
#include <iostream>
#include <sys/time.h>
using namespace std;
int main()
{
    int arr[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    
    int *p[4];                          //指针数组,[]优先级高于*。p是一个数组,里面存放了4个指向整型数据的指针
    int (*q)[4];                        //数组指针,()优先级高,说明q是一个指针,这个指针指向一个大小为4个元素的数组的首地址
    
    for(int i = 0;i<4;i++)
    {
        for(int j = 0;j<4;j++)
            printf("%4d ",arr[i][j]);
        printf("\n");
    }
    printf("\n");
    q = arr;
    for(int i = 0;i<4;i++)
    {
        for(int j = 0;j<4;j++)
        {
            printf("%4d ",*(*(q+i)+j));  //对于数组指针来说,相当于二级指针?
        }
        printf("\n");
    }
    printf("\n");
    for(int i = 0;i<4;i++)
        p[i] = arr[i];                   //指针数组,让指针数组里每一个元素对应每一行行开头的地址
    
    for(int i = 0;i<4;i++)
    {
        for(int j = 0;j<4;j++)
            printf("%4d ",*(p[i]+j));
        printf("\n");
    }
    printf("\n");
}