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

来源:互联网 发布:linux 密码修改无限 编辑:程序博客网 时间:2024/05/27 20:58
我想测试下指针数组和数组的指针,两者的区别,:就是这样的定义的区别:   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) 或理解为一维数组的长度为22表示指向一维数组的个数通常这样用  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:28int16_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]);     }


原创粉丝点击