• 指向二维数组的指针测试


    定义a为二维数组后,有三种成份:数组本身、3个一维数组(a的每一行对应一个一维数组)、12个数组元素,

    由此就有三种指针及对应的指针变量,

    1. &a和int (*p1)[3][4](没有实用意义)、
    2. &a[i]和int (*p2)[4](当i为0时,&a[0]可简化为a)、
    3. a[i][j]和int *p3;
      由于指针类型匹配是完全匹配,所以初始化形式必须严谨。
      上面有人写出
      int (*p)[4]=&a;
      则是类型不匹配,指向一维数组的指针变量指向了二维数组,尽管有些编译器只给warning、尽管有人认为指针值(二维数组a和一维数组a[0]的地址值)是相同的,事实是类型不匹配、错误
      还有人写出
      int *p = &a[0][0];/*或者int *p = a[0];*/
      这个指针变量是指向数组元素的,没有了数组结构信息,因此用该指针变量访问数组元素时,只能再提供列数信息进行地址计算: *(p+i*列数+j)

    结论是 
    int (*p)[4]=a;/*或者int (*p)[4]=&a[0]*/
    是严格指针类型匹配的,且p具有数组结构信息(列数),可以直接访问数组元素
    *(*(p+i)+j)等价于a[i][j]
    提供一个小“伎俩”供分析用:指针(变量)左边一个*可等效替换为右边一个[],两个*可等效替换为。。。

    上面为引用自CSDN的讨论

    写个程序测试一下

       1:  #include <stdio.h>
       2:   
       3:  int main()
       4:  {
       5:      int s[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
       6:      int i, j;
       7:      int (*p)[5] = s;//=&s[0];
       8:      int *q = &s[0][0];
       9:   
      10:      printf("%d ",s[0][0]);
      11:      printf("%d ",*s[0]);
      12:      printf("%d ",**s);
      13:      
      14:      printf("%d ",*(*(p+2)+2) );
      15:      printf("%d ",*(q+12));
      16:  }
  • 相关阅读:
    机器学习问题之屌丝的女神专属
    【读点paper】irgan
    回老园子
    【Linux】常用命令收集
    【Matlab】基本语法
    【Ubuntu】log
    【Java 学习笔记】 Hadoop学习笔记
    【Algorithm】 字符串算法
    【WordPress】小卡的土豆园开张
    【Log】Self-Check Log
  • 原文地址:https://www.cnblogs.com/ppazhang/p/3094180.html
Copyright © 2020-2023  润新知