我有一个二维数组,int buf[400][N];在程序中传入一个指针调用,因为 N 这个数值不是固定的,所以不能用 int (*mybuf)[N] 这样传入,只用了 int *mybuf 这时候访问buf就为 mybuf[y * N + x] ,但是这样每次都需要做一次乘法,数据量大了速度就十分慢,不知大家有没有什么好方法?比如在函数定义时,就可以定义 int (*mybuf)[N] 这样的,或者就用 int *mybuf 访问二维数组,但是不用做乘法……谢谢了!
调试欢乐多
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] ,效果也是一样的
{
p[i]=...
}int main()
{
int *p[400]; for(...)
(*p)=new int[N]; fun(*p);
}不行吗?
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];
//#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;
}