指向二维数组的指针测试

本文深入探讨了C语言中二维数组的指针使用方法,包括如何正确地使用指针变量、指针初始化以及如何通过指针访问二维数组元素。通过实例演示和代码分析,读者将学会在实际编程中灵活运用二维数组指针。

定义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]
提供一个小“伎俩”供分析用:指针(变量)左边一个*可等效替换为右边一个[],两个*可等效替换为。。。

上面为引用自优快云的讨论

 

写个程序测试一下

   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:  }

转载于:https://www.cnblogs.com/ppazhang/archive/2013/05/23/3094180.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值