数组指针和指针数组

Posted on 2016-06-01 13:34  洪爵士  阅读(158)  评论(0编辑  收藏  举报
() 和 [] 的优先级一样,但是结合性是从左往右,所以*和p先结合,说明这是一个指针
    这个指针指向一个整型的数组,并且这个数组每行的长度为n,也就是p的步长。
    所谓数组指针都是因为指针的步长问题
1. 数组指针(行指针)    // 数组指针:指向数组的指针(在C语言里就是用来指向一个二维数组的)
    定义形式:int (*p)[n];
    /////////////////////////////////////////////
    二维数组和数组指针:
    int a[2][3] = {{10, 20, 30}, {40, 50, 60}};   //char b[5]={'a','b','c','d','e'}                                                               
    int (*p)[3] = a;                             //char (*pb)[5]=&b;      
    int row=sizeof(a)/sizeof(a[0]);//数组行数
    int col=sizeof(a[0])/sizeof(a[0][0]);//数组列数         
  第0行第1列元素的地址 p[0]+1      *p+1              &p[0][1]  
    第1行第2列元素的地址 p[1]+2      *(p+1)+2          &p[1][2]
    第i行第j列元素的地址 p[i]+j      *(p+i)+j          &p[i][j]
    第0行第1列元素的值   *(p[0]+1)   *(*p+1)           p[0][1]  
    第1行第2列元素的值   *(p[1]+2)   *(*(p+1)+2)       p[1][2]
    第i行第j列元素的值   *(p[i]+j)   *(*(p+i)+j)       p[i][j]
  二维数组和数组名: 
    int a[2][3]    = {{10, 20, 30}, {40, 50, 60}};
    第0行第1列元素的地址 a[0]+1      *a+1              &a[0][1]  
    第1行第2列元素的地址 a[1]+2      *(a+1)+2          &a[1][2]
    第i行第j列元素的地址 a[i]+j      *(a+i)+j          &a[i][j]
    第0行第1列元素的值   *(a[0]+1)   *(*a+1)           a[0][1]  
    第1行第2列元素的值   *(a[1]+2)   *(*(a+1)+2)       a[1][2]
    第i行第j列元素的值   *(a[i]+j)   *(*(a+i)+j)       a[i][j]
结论:a是一个指向int array[5]的数组指针(在二维数组里也叫行指针),&a代表整个数组的地址
     a+1偏移3个int的长度(也就是3*4个字节),&a+1偏移2*3个int的长度(也就是2*3*4字节)
     (a+i)代表着整个第i行的地址  *(a+i)代表着第i行首元素的地址  
     数组名是一个常量指针永远指向数组首元素的地址
2. 指针数组://指针数组:装有指针的数组
    定义形式: int *p[n];
    char *p[]={"abc","efg","ijk"};//指针数组:装有指针的数组
    int num=sizeof(p)/sizeof(p[0])//字符串的个数,注意[]里是否写了数字
////////////////////////////////////////////////////
    一维数组和指针:    
    int a[5] = { 10, 20, 30, 40, 50};      
    int *p = a;                             
    第0个元素的地址   p        &p[0]
    第1个元素的地址   p+1      &p[1]
    第i个元素的地址   p+i      &p[i]
    第0个元素的值     *p       p[0]
    第1个元素的值     *(p+1)   p[1]
    第i个元素的值     *(p+i)   p[i]
    一维数组和数组名: 
    int a[5] = { 10, 20, 30, 40, 50}; 
    int count=sizeof(a)/sizeof(a[0])//数组的个数,注意[]里是否写了数字
    第0个元素的地址   a        &a[0]
    第1个元素的地址   a+1      &a[1]
    第i个元素的地址   a+i      &a[i]
    第0个元素的值     *a       a[0]
    第1个元素的值     *(a+1)   a[1]
    第i个元素的值     *(a+i)   a[i]
    结论:a代表数组首元素的地址,&a代表整个数组的地址
          a+1偏移一个int的长度(也就是4个字节),&a+1偏移4个int的长度(也就是5*4字节)
          数组名是一个常量指针永远指向数组首元素的地址
    //////////////////
    注意:当用 sizeof(a)/sizeof(a[0]) 时要看数组中的[]是否写了数字