指向数组的数组指针_____论坛提问

我想测试下指针数组和数组的指针,两者的区别,:
就是这样的定义的区别:

   int16_t (* mv_cache)[2];   ///这个是加括号
   uint8_t (* mvd_cache)[2];
   
   int16_t *mv_cache2[2];  ///这个是没有加括号
   uint8_t *mvd_cache2[2];

请教下,哪位能给详细的解释下,
我的测试程序如下,可是在运行的时候,总是提示说”段错误“
#include <stdio.h>
 
typedef short int16_t;
typedef unsigned char uint8_t;
 
int main()
{
   int16_t (* mv_cache)[2];
   uint8_t (* mvd_cache)[2];
    
   int16_t *mv_cache2[2];
   uint8_t *mvd_cache2[2];
    
    
  mvd_cache[1][0]=0xaa;
  mvd_cache2[1][0]=0x11;
  printf("mv cache[1][0] is %d\n",mv_cache[1][0]);
  printf("mv cache2[1][0] is %d\n",mv_cache2[1][0]);
 
   
   mv_cache[1][0]=0xff;
   mv_cache2[1][0]=0x55;
     
 
   
   
  printf("mvd_cache[1][0] is %d\n",mv_cache[1][0]);
  printf("mvd_cache2[1][0] is %d\n",mv_cache2[1][0]);
  return 0;
}
zhuankeshumo回复于: 2012-11-15 17:00:26
				  int16_t (* mv_cache)[2];  //指向二维数组的指针变量(二维数组列数为2) 或理解为一维数组的长度为2
				2表示指向一维数组的个数
				通常这样用  int16_t a[5][2];   mv_cache=a; //指向数组第一行的首地址
				  int16_t *mv_cache2[2]; mv_cache2是一个指针数组,有两个下表变量mv_cache2[0],mv_cache2[1]均为指针变量
yleek 回复于: 2012-11-15 22:17:28
				int16_t (* mv_cache)[2];
				uint8_t (* mvd_cache)[2];
				首先上面这两句只定义了两个指针,他们分别是int16_t[2]和uint8_t[2]类型的指针,注意,你只是定义了指针,并没有分配空间,这个时候他们还是野指针呢,很危险。就像如下:
				int *p;
				*p = 1;//肯定段错误,因为p指向一块不确定的内存区域
				-----------
				从上面可以引出定义函数的指针的方法,类似
				int16_t (*pfunc)(void);
				----------------------------------------
				int16_t *mv_cache2[2];//mv_cache2是一个数组类型,int16_t* [2],数组包含2个元素,元素是int16_t*类型 
				uint8_t *mvd_cache2[2];//同上
				这两句着实定义了两个数组,并且已经分配内存空间。但是一看你用了两个[][]操作,也就是两次解引用,多数是要段错误了,因为进行一次[]操作,得到的是int16_t*类型,这又是一个野地址啊,指向不确定的内存区域。
				-----------
				引出返回指针类型的函数的定义,类似
				int16_t *foo(void);
				
				注意他们的区别,切记两条:
				一、数组名就是指向数组的第一维的元素类型的指针类型,如int p[2][3];p就是int[3]类型
				二、p[2] 等于 *(p+2)甚至等于*(2+p),编译器确实是这么处理的

自己的练习:
#include "stdio.h"
///练习数组指针,这个一个指向数组的数组指针,即在一个数组中放多个指针,每个指针分别指向一个数组。
void main()
{
   int a[2][3][3];   ///这个比较特殊一点,这样定义指针p,这个p指向的是一个2维数组。
    int aa[5][3];
    int (*b)[3]=&a[0][0]; ///由于一对圆括号的存在,所以*号首先与b结合,说明b是一个指针变量,然后再与说明符[3]结合,
    ///说明指针变量b的基类型是一个包含有3个int元素的数组;; 特意说明这个指向的类型是int [3]; 
     ///如果别的要定义,需要定义一个类型为int [3] 的类型,int a[2][3][3];或者int aa[5][3];
     
    a[0][0][0]=1;
    a[0][0][1]=2;
    a[0][0][2]=3;
    a[0][1][0]=4;
    a[0][1][1]=558555;
    a[0][1][2]=6;
     printf("%d\n",b[1][1]);
      
     aa[0][0]=470;
     aa[0][1]=51;
     aa[0][2]=52;
     aa[1][0]=53;
     aa[1][1]=54;
      
     b=aa;
     printf("b =%d\n",b[0][1]);     
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值