我想,如果以某种方式实现单维,就像
a[i]=*(a+i),
所以a [i] [j]必须是
*(a+i*ROWSIZE+j)
我错了吗?
请阅读http://habrahabr.ru/blogs/algorithm/135948/
Думаю,нестоитговоритьотом,чтоодномерныймассивбыстреедвумерного,атакже,чтостатическиймассивконстантнойдлиныбыстреединамического的std ::矢量
答案 0 :(得分:3)
我不完全确定你的意思是“慢”。就实际访问时间(从内存中获取数据所需的时间)而言,这些都不相同。就计算偏移所需的纳秒数而言,是的,2D会增加最小的开销。
答案 1 :(得分:2)
如果a
是一个多维数组,那么你是对的。这是一回事。
但是a[i][j]
语法也可以用来索引一个指针数组,这是另一回事。
所以这取决于a的定义:
char a[N][M]; // Behaves as you describe
char *b[N]; // b[x][y] reads twice from memory.
答案 2 :(得分:1)
不,虽然您的标题似乎与您的问题无关。
答案 3 :(得分:0)
你是对的,但输入可能更清晰:
a[i*ROWSIZE + j]
清楚地表明您正在索引数组而不是仅仅偏移指针。
答案 4 :(得分:0)
在C中,假设a
是一个数组数组,而i
和j
整数则在表达式中,
a[i][j]
相当于
*(*(a+i)+j)
例如,给定,
int a[ROW][COL];
然后在表达式中:
a[i][j] == *(*(a+i)+j) == *(a[i] + j) == *((int *) a + i * COL + j)
答案 5 :(得分:0)
实际上,这取决于声明的方式。
至少有两种可能性
int a[4][4];
分配4 * 4 * sizeof(int)字节,并且 - 正如你所指出的 - 需要乘法来索引。
另一个选项是
int **a;
- 初始化时 - 是指向其他单维数组的指针的单维数组。
也就是说,a [i]返回指向实际行的指针,添加的[j]返回行中的正确值。
这不需要任何乘法索引。