指针数组和数组指针分析

//指针数组和数组指针分析
#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
*/
原文地址:https://www.cnblogs.com/ikaka/p/3352184.html