int dct2d[8][8];
int (*pdct2d)[8][8];
pdct2d=dct2d;结果编译不过,请问该怎么写?

解决方案 »

  1.   

    你这个是要干什么?pdct2d是个指针数组,它的每个元素都是指针,所以任何一个元素都可以指向dct2d,例如用0,0元素pdct2d[0][0] = &dct2d[0][0];多为数组最好用指针,要不代码看着太乱,例如直接定义int* pdct2d = &dct2d[0][0];
      

  2.   

    int dct2d[8][8];
    int *pdct2d;
    pdct2d = (int*)dct2d;这样写就行了
      

  3.   

    给你一些资料和例子:设有如下数组说明:
        int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
        在C/C++中,可将二维数组的每一行看成一个元素,即数组a包含了三个元素a[0]、a[1]、a[2],数组名a是该一维数组a的指针,即a[0]元素的指针,a+1是a[1]元素的指针,a+2是a[2]元素的指针。指针与二维数组的关系可用下图概括。其中:
    行指针:行方向的指针a、a+1和a+2,是指向一维数组的指针,其指针类型为含有三个整型元素的一维数组;
    列指针:列方向的指针a[0]、a[0]+1、a[0]+2、… 、a[2]+2,其指针类型为整型。
    注意:尽管a与a[0]、a+1与a[1]、a+2与a[2]的值相同,但类型不同,若有必要,可相互转换。
    图片地址:http://hi.csdn.net/attachment/201201/27/0_1327640416M0bM.gif推广:设有说明“int a[M][N];”(M、N均为符号常量),则元素a[i][j](0≤i<M,0≤j<N)的指针为:
        ①a[i]+j,原因如图②*(a+i)+j,因a[i]等价于*(a+i)
        ③*(&a[i])+j,因a+i等价于&a[i]④&a[i][j]
    元素a[i][j]也有如下等价表示:
        ①*(a[i]+j)②*(*(a+i)+j)③(*(a+i))[j]
    例  用指针输出二维数组的元素值。
    #include<iostream.h>
    #include<iomanip.h>void main(void)
    { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j,*p;  cout<<"用指针输出数组的全部元素:\n";
      for(p=(int*)a,i=0;i<9;i++)
      {  if(i&&i%3==0) cout<<'\n';
         cout<<*p++<<'\t';
      }cout<<"\n用四种不同方法输出数组的元素:\n";
        for(i=0;i<3;i++)
           for(j=0;j<3;j++)
              cout<<*(a[i]+j)<<'\t'
                  <<*(*(a+i)+j)<<'\t'
                  <<(*(a+i))[j]<<'\t'
                  <<a[i][j]<<'\n';
        cout<<"用指针输出数组的各个元素:\n";
        for(i=0,p=a[0];p<=a[2]+2;p++,i++)
        {  if(i&&i%3==0) cout<<'\n';
           cout<<setw(4)<<*p;
        }
    }
      

  4.   

    int dct2d[8][8];
    int (*pdct2d)[8][8];
    pdct2d=dct2d;我的意思就是定义一个指针pdct2d,来代替dct2d,然后用pdct2d[0][1]等形式访问dct2d的元素。
    这个pdct2d应该是一个指向二维数组的指针。但是二楼的方法是不行的。
    谢谢两位。
      

  5.   

    如果这样:
    int dct2d[8][8];
    int **pdct2d;pdct2d=dct2d;
    这样编译倒是可以通过,但是执行报错。
    跟踪发现,的确是将dct2d的地址传递给pdct2d了。
      

  6.   


    不知道你这么做有何意义,pdct2d[0][1]这样本来就可以访问数组元素
      

  7.   

    指针法和下标法访问数组其实没什么不一样的,还是你的那个问题,那里不能定义二维指针,然后用下标访问,要定义一维指针,以前看书就是这么说的,一直也是这么用的,原因不明,我估计因为对于pdct2d来说,数组的跨度是未知的,如下int* pdct2d = &dct2d[0][0];或如ls的(int*) dct2d用指针法取dct2d的[n][n]号元素
    *(pdct2d + n * 8 + n)用下标法取dct2d的[n][n]号元素
    pdct2d[n * 8 + n]
      

  8.   

    int dct2d[8][8];
    int (*pdct2d)[8][8];
    pdct2d=dct2d
    第一行是没问题了,第二行你应该声明8个指针,你实际上声明了8*8个,这样:
    int (*pdct2d)[8];
    但是这时不能用,应该:
    for(int i=0; i<8; i++)
    {
    pdct2d[i] = dct2d[8];
    }
    这样就应该能用了,你试试。
      

  9.   

    错了,应该是pdct2d[i] = dct2d[i];
      

  10.   

    int a[3][3];
    int (*p)[3];p=(int (*)[3])a[0];然后p[j][i]即等同于a[j][i]。为什么非要定义一个指针访问这个二维数组,因为这个二维数组的名称、下标都是经过几次间接调用,所以很长,写代码的时侯语句很长,难以阅读,用一个新指针就很简洁明了。谢谢各位热心。