J..*_*..S 1 c arrays gcc pointers
我有一个 50 x 50 的矩阵arr[50][50]
,需要交换子数组arr[0]
和arr[1]
. 即,每个子数组中的全部 50 个元素需要交换。
我能想到的唯一方法是使用如下循环:
for(i=0; i<50; ++i)
{
int t = arr[0][i];
arr[0][i] = arr[1][i];
arr[1][i] = t;
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更简单或更短的方法?也许使用指针?
我试过这样的事情
int *t = arr[0];
arr[0] = arr[1];
arr[1] = t;
Run Code Online (Sandbox Code Playgroud)
但它在第一行给出了关于“从类型'int *'分配给类型'int [2]'时不兼容的类型”的错误。
然后我尝试指向一个数组
int (*t)[50] = arr[0];
arr[0] = arr[1];
arr[1] = t;
Run Code Online (Sandbox Code Playgroud)
这次我在第二行遇到了关于“从类型 'int *' 分配给类型 'int[50]' 时不兼容的类型”的错误。
如果您的矩阵是这样实现的,arr[50][50]
那么物理交换两行的唯一方法是在内存中物理交换数据。你的周期是一种方法。其余的只是该方法的变体。您可以一个一个地交换矩阵元素(您的循环),您可以使用中间行大小的缓冲区(memcpy
方法)交换整行。他们所有人仍然做同样的事情。没有办法解决。
如果您的数组以不同的方式实现 - 例如,一个“锯齿状”数组实现为指向子数组的指针数组,那么您将能够只交换两个指针并完成它。但在这种情况下arr[50][50]
是不可能的。
如果您愿意,您可以通过单独的行指针数组将当前数组“转换”为“锯齿状”版本。该行指针数组现在将成为您的 matrix a
,而原来的a[50][50]
将成为a_data
int a_data[50][50];
int *a[50];
for (unsigned i = 0; i < 50; ++i)
a[i] = a_data[i];
/* Fill the matrix */
for (unsigned i = 0; i < 50; ++i)
for (unsigned j = 0; j < 50; ++j)
a[i][j] = rand();
/* Print the matrix */
for (unsigned i = 0; i < 50; ++i)
{
for (unsigned j = 0; j < 50; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
/* Swap the rows */
int *temp = a[0];
a[0] = a[1];
a[1] = temp;
/* Print the matrix */
for (unsigned i = 0; i < 50; ++i)
{
for (unsigned j = 0; j < 50; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
请注意,尽管a
现在的物理结构有所不同,但您仍然可以使用a[i][j]
语法来处理它。
归档时间: |
|
查看次数: |
284 次 |
最近记录: |