我有一个二维数组,int buf[400][N];在程序中传入一个指针调用,因为 N 这个数值不是固定的,所以不能用 int (*mybuf)[N] 这样传入,只用了 int *mybuf 这时候访问buf就为 mybuf[y * N + x] ,但是这样每次都需要做一次乘法,数据量大了速度就十分慢,不知大家有没有什么好方法?比如在函数定义时,就可以定义 int (*mybuf)[N] 这样的,或者就用 int *mybuf 访问二维数组,但是不用做乘法……谢谢了!

解决方案 »

  1.   

    如果用VC,没法定义不定长的数组,那是C99标准,gcc支持的
    void test(int N)
    {
    int (*mybuf)[N];}
    在gcc下是可以通过的.
    其实平时C/C++在二维数组寻址也是用乘法的
    如以下程序:
    int buf[11][11];
    void test(int m,int n)
    {
       printf("%d",buf[m][n]); // int (*mybuf)[N];}
    它生成的汇编如下:_test PROC NEAR
    ; File t.c
    ; Line 5
    push ebp
    mov ebp, esp
    ; Line 6
    mov eax, DWORD PTR _m$[ebp]
    imul eax, 44 ; 0000002cH
    mov ecx, DWORD PTR _n$[ebp]
    mov edx, DWORD PTR _buf[eax+ecx*4]
    push edx
    push OFFSET FLAT:$SG775
    call _printf
    add esp, 8
    ; Line 8
    pop ebp
    ret 0所以,即使你定义了int (*mybuf)[N] ,效果也是一样的
      

  2.   

    int fun(int *p)
    {
      p[i]=...
    }int main()
    {
       int *p[400];  for(...)
        (*p)=new int[N];  fun(*p);
    }不行吗?
      

  3.   

    更一般化,变长m行n列数组
    int m,n;
    int **pp=new int*[m];
    for(i=0 to m)
        p[i]=new int[n];那p就是变常得2维数组可以用p[i][j]来访问了。for(i=0 to m)
      for(j=0 to n)
        // do oper on p[i][j];
      

  4.   

    // x.cpp : 定义控制台应用程序的入口点。
    //#include "stdafx.h"
    #include<iostream>
    using namespace std;int show(int **p,int m,int n)
    {
    int i,j;
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    cout<<p[i][j];
    return 0;
    }
    int main()
    {
    int i,j;
    int m=5,n=10;
    int **p; p=new int*[m];
    for(i=0;i<m;i++)
    p[i]=new int[n]; for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    p[i][j]=rand()%10; show(p,m,n);
    system("pause");
    return 0;
    }