user-0 提问: 二位数组查找问题.

回复:
user: user-1
content: 引用 8 楼 zhao4zhong1 的回复:[quote=引用 6 楼 cao_julians 的回复:] 二维数组的遍历与计算机的体系结构（CPU与主存间有一块称为cache的高速缓存）有关。提供两个线索 1.《深入理解计算机系统》 2.前几年计算机考研的专业课考试题，结合了软硬件知识的一道题  结论性的是按行效率高 无profiler不要谈效率！！ 尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！[/quote] 这个版块是C吧，本帖帖主问的是二维数组吧，你给出那么一大堆的与C中数组有直接关系吧？ 另一点，对你老ZHAO说，学C在学汇编之前，你动不动让初学者去汇编级看问题合适吧？

user: user-2
content: 作为一个应用软件的设计者，没必要这么细究其差别

user: user-3
content: 从连续排布的那个维度扫描。  最好的办法是不要用a[m][n]这种东西，而是自定义数组，用a(m,n)的形式来调用。

user: user-4
content: 前几天看到一个题，行递增，列也是递增，然后查看这个数组中是否有某一个数， 这样你就没必要一直行列的去找了，根据结果选择行列， 行列的遍历，关键要看具体情况，

user: user-5
content: 应该没什么区别吧！

user: user-6
content: 有区别，一般来说在不同语言中，数据排列方式不同。 C,C++和 fortran 有所不同。 如果希望C，C++和 fortran协调工作，必须正确处理这个问题。 两外C，C++ 每行数据，连续存储在一起，这样分行处理比较简单。 C,C++读取一列数据比较麻烦，因为不是连续存放的。   fortran  每列数据，连续存储在一起，这样分列处理比较简单。 读取一行数据比较麻烦，因为不是连续存放的。  另外，即使fortran  ,C,C++分别读写同一批数据； 由于数据排列方式不同，所以对行和列解释也不同。 不过形式却差不多 C，C++ int a[10][20]; fortran ： integer a(1:10,1:20) 同样10行20列数据，行和列正好相反 fortran 要定义排列相同的数据，定义成20行10列即可。 改成 integer  a(1:20,1:10) 即下标次序相反。  结果是赵老师的，那个读写文件的法子，也不是一定行得通的。 因为C，C++和Fortran 对航和列的解释不一样，所以输出数据的排列，也不一定一样。  这里，主要问题各个语言的是习惯，而不是效率。

user: user-7
content: 引用 6 楼 cao_julians 的回复:二维数组的遍历与计算机的体系结构（CPU与主存间有一块称为cache的高速缓存）有关。提供两个线索 1.《深入理解计算机系统》 2.前几年计算机考研的专业课考试题，结合了软硬件知识的一道题  结论性的是按行效率高 无profiler不要谈效率！！ 尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-7
content: 引用 5 楼 q5390498 的回复:二维数组其实就是个一维数组，都是连续内存，行列和列行 都可以遍历，对于没什么特殊的遍历一般选择行列，但在需要的时候，再选择列行，其实也没什么。。 谁说的? //在堆中开辟一个4×5的二维int数组 #include <stdio.h> #include <malloc.h> int **p; int i,j; void main() {     p=(int **)malloc(4*sizeof(int *));     if (NULL==p) return;     for (i=0;i<4;i++) {         p[i]=(int *)malloc(5*sizeof(int));         if (NULL==p[i]) return;     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             p[i][j]=i*5+j;         }     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             printf(" %2d",p[i][j]);         }         printf("\n");     }     for (i=0;i<4;i++) {         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19

user: user-1
content: 二维数组的遍历与计算机的体系结构（CPU与主存间有一块称为cache的高速缓存）有关。提供两个线索 1.《深入理解计算机系统》 2.前几年计算机考研的专业课考试题，结合了软硬件知识的一道题  结论性的是按行效率高

user: user-8
content: 二维数组其实就是个一维数组，都是连续内存，行列和列行 都可以遍历，对于没什么特殊的遍历一般选择行列，但在需要的时候，再选择列行，其实也没什么。。

user: user-7
content: 仅供参考//有两个每一项都是0或1组成的二维数组：A[50][50]和B[2][2] //找出在A里包含有多少与B相同的项，并标出坐标 #include <stdio.h> #include <stdlib.h> #include <time.h> int A[50][50]; int B[2][2]; int y,x; int j,i; int n; int main() {     srand(time(NULL));     for (y=0;y<50;y++) {         for (x=0;x<50;x++) {             A[y][x]=rand()%2;         }     }     for (y=0;y<2;y++) {         for (x=0;x<2;x++) {             B[y][x]=rand()%2;         }     }     n=0;     for (y=0;y<50-2+1;y++) {         for (x=0;x<50-2+1;x++) {             for (j=0;j<2;j++) {                 for (i=0;i<2;i++) {                     if (A[y+j][x+i]!=B[j][i]) goto NE;                 }             }             n++;             printf("n    y,x=%4d %2d,%2d\n",n,y,x);             NE:;         }     }     return 0; } //n    y,x=   1  0, 1 //n    y,x=   2  0, 3 //n    y,x=   3  0,17 //n    y,x=   4  1,12 //n    y,x=   5  1,20 //n    y,x=   6  1,33 //n    y,x=   7  2, 4 //n    y,x=   8  2,32 //n    y,x=   9  3,13 //n    y,x=  10  3,31 //n    y,x=  11  3,48 //n    y,x=  12  4, 0 //n    y,x=  13  5,14 //n    y,x=  14  5,32 //n    y,x=  15  5,36 //n    y,x=  16  5,47 //n    y,x=  17  6, 7 //n    y,x=  18  6,17 //n    y,x=  19  6,45 //n    y,x=  20  7, 1 //n    y,x=  21  7,31 //n    y,x=  22  8, 0 //n    y,x=  23  8,16 //n    y,x=  24  8,18 //n    y,x=  25  8,25 //n    y,x=  26  9, 9 //n    y,x=  27  9,27 //n    y,x=  28 10,12 //n    y,x=  29 10,26 //n    y,x=  30 12,12 //n    y,x=  31 12,20 //n    y,x=  32 13,36 //n    y,x=  33 13,45 //n    y,x=  34 13,48 //n    y,x=  35 14, 5 //n    y,x=  36 14, 7 //n    y,x=  37 14, 9 //n    y,x=  38 14,21 //n    y,x=  39 15, 4 //n    y,x=  40 15,20 //n    y,x=  41 16,10 //n    y,x=  42 16,23 //n    y,x=  43 16,45 //n    y,x=  44 17,16 //n    y,x=  45 17,22 //n    y,x=  46 17,40 //n    y,x=  47 18, 1 //n    y,x=  48 18, 5 //n    y,x=  49 18,26 //n    y,x=  50 18,43 //n    y,x=  51 19,40 //n    y,x=  52 19,46 //n    y,x=  53 20,31 //n    y,x=  54 20,38 //n    y,x=  55 21,27 //n    y,x=  56 21,41 //n    y,x=  57 21,48 //n    y,x=  58 22,10 //n    y,x=  59 22,15 //n    y,x=  60 22,20 //n    y,x=  61 22,24 //n    y,x=  62 23, 0 //n    y,x=  63 23, 3 //n    y,x=  64 23,40 //n    y,x=  65 24,11 //n    y,x=  66 24,14 //n    y,x=  67 24,29 //n    y,x=  68 24,34 //n    y,x=  69 24,43 //n    y,x=  70 25,16 //n    y,x=  71 25,19 //n    y,x=  72 25,25 //n    y,x=  73 26,18 //n    y,x=  74 26,23 //n    y,x=  75 27, 9 //n    y,x=  76 27,44 //n    y,x=  77 28, 7 //n    y,x=  78 28,22 //n    y,x=  79 28,24 //n    y,x=  80 28,33 //n    y,x=  81 28,48 //n    y,x=  82 29, 0 //n    y,x=  83 29,35 //n    y,x=  84 29,41 //n    y,x=  85 29,44 //n    y,x=  86 30, 7 //n    y,x=  87 30,23 //n    y,x=  88 31,35 //n    y,x=  89 31,41 //n    y,x=  90 31,45 //n    y,x=  91 33,21 //n    y,x=  92 33,27 //n    y,x=  93 34, 2 //n    y,x=  94 34,19 //n    y,x=  95 34,25 //n    y,x=  96 34,47 //n    y,x=  97 35,14 //n    y,x=  98 36, 6 //n    y,x=  99 36,13 //n    y,x= 100 36,25 //n    y,x= 101 36,31 //n    y,x= 102 36,41 //n    y,x= 103 36,47 //n    y,x= 104 37,11 //n    y,x= 105 37,16 //n    y,x= 106 37,24 //n    y,x= 107 37,30 //n    y,x= 108 38,18 //n    y,x= 109 38,20 //n    y,x= 110 38,28 //n    y,x= 111 38,38 //n    y,x= 112 39,32 //n    y,x= 113 39,43 //n    y,x= 114 39,45 //n    y,x= 115 39,48 //n    y,x= 116 40,35 //n    y,x= 117 40,38 //n    y,x= 118 41,33 //n    y,x= 119 42, 9 //n    y,x= 120 42,13 //n    y,x= 121 42,22 //n    y,x= 122 42,25 //n    y,x= 123 43,21 //n    y,x= 124 44,25 //n    y,x= 125 45,15 //n    y,x= 126 45,20 //n    y,x= 127 45,42 //n    y,x= 128 46, 4 //n    y,x= 129 47, 3 //n    y,x= 130 47,22 //n    y,x= 131 47,33 //n    y,x= 132 47,43 //n    y,x= 133 47,45 //n    y,x= 134 47,48 //n    y,x= 135 48, 0 //

user: user-9
content: 最主要的是寻址方式不同，都能遍历的

user: user-10
content: 有区别，从内存排列上是这样的 假设 a[3][6] 的字符： a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5]  a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5]  a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5] ;  可以看到，如果逐行遍历的话，是顺序的访问数据，对于CPU优化而言会非常好，如果列行遍历的话，每次都寻址，所以效率上有较大的差异，特别是当数组维数巨大的时候，每次太多寻址带来非常巨大的开销。