我想遍历我已转换为1D的2D方阵。
问题在于我想要遍历它,就好像我在对角线条中穿越原始2D一样。
数组是对角线的,我最初用1D中的malloc创建它,以避免分配太多内存。
数组的大小:
int Tsize = N*(N+1)/2; //table size -> diagonal array of (N+1)*N/2 elements
int* table = malloc(Tsize*sizeof(int));
我知道你通过这种方式遍历一个扁平的2D阵列。
do{
i = row*N + col;
col++;
if (col>N-1){
col = 0;
row++;
}
printf("%d ", x[i]);
} while( row < N);
我发现here是在对角线条中遍历数组。
对于这个数组:
int x[3][3] = {1, 2, 3,
ø, 4, 5,
ø, ø, 6};
ø:我不会使用那个元素。
我创建了这个数组:
int k[6] = {1,2,3,4,5,6};
我希望像那样遍历它:
1,4,6,2,5,3
你能提出什么建议吗?我被卡住了。
答案 0 :(得分:0)
当您说将二维数组分配为一维数组时,您所描述的内容称为数组展平。展平数组实际上是一种常见的安全措施,因为the structure of an array gives you a lot of information on its own,因此对代码进行了模糊处理以减轻这种影响。即使the program's control flow itself也会被混淆以获得额外的安全性。
要将一个假想的3x3矩阵对角线移动到一个大小为9的一维数组中,您可以从arr[0]
开始,只需将4加到偏移处即可。这个方法是essentially isomorphic从左上角到右下角迭代矩阵对角线,同时提供一些额外的保密,因为it's not as trivial to deduce the structure of the data。
您可以像这样可视化此转换:
a [0] [1] [2]
[3] [4] [5]
[6] [7] [8]
b [0] [1] [2] [3] [4] [5] [6] [7] [8]
因此,当您遍历第一个数组时,您将嵌套两个for
循环,并传达这是一个二维数组的事实。另一方面,当通过从0开始将索引递增4来迭代第二个数组时,您将访问与第一个数组中相同的元素,但是您正在执行它而不会泄露底层结构数据。
这个人为的例子对于实际使用来说太微不足道了,但我鼓励你研究一下。如果您有任何问题,请告诉我。
答案 1 :(得分:0)
这样的东西?
#include <stdio.h>
#include <stdlib.h>
int
main() {
int i, n = 5;
int *arr = malloc(n*n*sizeof(int));
for (i = 0; i < n*n; i++)
arr[i] = i + 1;
for (i = 0; i < n*n; i += n+1)
printf("%d ", arr[i]);
}