如何交换使用数组指针定义的二维数组中的行?
How could I swap rows in a 2D array defined using pointers to array?
我想交换定义如下的二维数组的两行。
double (*mat)[N];
mat = (double(*)[N])malloc(m*sizeof(double [N]));
...
swap(mat, mat+1);
但是我的 swap(mat, mat+1);
只交换每行中的第一个元素。
void swap(double **a,double **b){
double *temp;
temp = *a;
*a = *b;
*b = temp;
}
如果我使用一个定义为 double **mat;
且具有动态分配的行和行的二维数组,则相同的交换工作。
void swap(double **a,double **b)
之所以有效,是因为在这种情况下,您交换了指针。但是当你声明:
double (*mat)[N];
它是一个指向数组的指针。这就是为什么它只交换每行的第一个值的原因。
如果你想交换两个数组,只需要使用指针(不要使用双指针):
void swap( double *m1, double *m2, size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
double tmp = m1[i];
m1[i] = m2[i];
m2[i] = tmp;
}
}
然后当你想交换两行时:
swap(mat[0], mat[1], N);
你是对的——你必须将指针对指针传递给int
作为交换函数的参数。为什么?你想改变指针本身。传递一个简单的指针,该函数将收到一个副本,并且任何更改都将在 return.
上丢失
这里的关键是,如果不使用 memcpy
实际交换数据,就不能直接交换分配集合中的行。为什么?这些行包含在您刚刚分配的连续内存块中。您可以简单地在分配的数据集合中的每一行的开头声明一个 array-of-pointers ,然后在 array-of-pointers,例如
#define MAXI 10
...
int (*a)[MAXI] = calloc (MAXI, sizeof *a), /* pointer to array */
*p[MAXI]; /* array of pointers */
for (int i = 0; i < MAXI; i++) { /* loop */
*a[i] = i, a[i][MAXI-1] = i; /* set first/last each row */
p[i] = a[i]; /* set pointer to each row */
}
现在您可以使用参数为指针到指针的函数交换指针,例如
void swpptr (int **a, int **b) /* swap pointers */
{
void *tmp = *a;
*a = *b;
*b = tmp;
}
与,例如:
puts ("\nswapping every other row...");
for (int i = 1; i < MAXI; i+=2) /* loop */
swpptr (&p[i-1], &p[i]); /* swap every other row */
一个简短的例子是:
#include <stdio.h>
#include <stdlib.h>
#define MAXI 10
void swpptr (int **a, int **b) /* swap pointers */
{
void *tmp = *a;
*a = *b;
*b = tmp;
}
void prn_ptr2ptr (int **p, int n) /* print n int per-pointer */
{
for (int i = 0; i < MAXI; i++) {
for (int j = 0; j < n; j++)
printf (" %d", p[i][j]);
putchar ('\n');
}
}
int main (void) {
int (*a)[MAXI] = calloc (MAXI, sizeof *a), /* pointer to array */
*p[MAXI]; /* array of pointers */
for (int i = 0; i < MAXI; i++) { /* loop */
*a[i] = i, a[i][MAXI-1] = i; /* set first/last each row */
p[i] = a[i]; /* set pointer to each row */
}
puts ("pre-swap:"); /* ouput pre-swap pointers */
prn_ptr2ptr (p, MAXI);
puts ("\nswapping every other row...");
for (int i = 1; i < MAXI; i+=2) /* loop */
swpptr (&p[i-1], &p[i]); /* swap every other row */
puts ("\npost-swap:"); /* output post-swap pointers */
prn_ptr2ptr (p, MAXI);
}
例子Use/Output
$ ./bin/ptr2arrayswap
pre-swap:
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 0 0 2
3 0 0 0 0 0 0 0 0 3
4 0 0 0 0 0 0 0 0 4
5 0 0 0 0 0 0 0 0 5
6 0 0 0 0 0 0 0 0 6
7 0 0 0 0 0 0 0 0 7
8 0 0 0 0 0 0 0 0 8
9 0 0 0 0 0 0 0 0 9
swapping every other row...
post-swap:
1 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 3
2 0 0 0 0 0 0 0 0 2
5 0 0 0 0 0 0 0 0 5
4 0 0 0 0 0 0 0 0 4
7 0 0 0 0 0 0 0 0 7
6 0 0 0 0 0 0 0 0 6
9 0 0 0 0 0 0 0 0 9
8 0 0 0 0 0 0 0 0 8
检查一下,如果您有任何问题,请告诉我。
我想交换定义如下的二维数组的两行。
double (*mat)[N];
mat = (double(*)[N])malloc(m*sizeof(double [N]));
...
swap(mat, mat+1);
但是我的 swap(mat, mat+1);
只交换每行中的第一个元素。
void swap(double **a,double **b){
double *temp;
temp = *a;
*a = *b;
*b = temp;
}
如果我使用一个定义为 double **mat;
且具有动态分配的行和行的二维数组,则相同的交换工作。
void swap(double **a,double **b)
之所以有效,是因为在这种情况下,您交换了指针。但是当你声明:
double (*mat)[N];
它是一个指向数组的指针。这就是为什么它只交换每行的第一个值的原因。
如果你想交换两个数组,只需要使用指针(不要使用双指针):
void swap( double *m1, double *m2, size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
double tmp = m1[i];
m1[i] = m2[i];
m2[i] = tmp;
}
}
然后当你想交换两行时:
swap(mat[0], mat[1], N);
你是对的——你必须将指针对指针传递给int
作为交换函数的参数。为什么?你想改变指针本身。传递一个简单的指针,该函数将收到一个副本,并且任何更改都将在 return.
这里的关键是,如果不使用 memcpy
实际交换数据,就不能直接交换分配集合中的行。为什么?这些行包含在您刚刚分配的连续内存块中。您可以简单地在分配的数据集合中的每一行的开头声明一个 array-of-pointers ,然后在 array-of-pointers,例如
#define MAXI 10
...
int (*a)[MAXI] = calloc (MAXI, sizeof *a), /* pointer to array */
*p[MAXI]; /* array of pointers */
for (int i = 0; i < MAXI; i++) { /* loop */
*a[i] = i, a[i][MAXI-1] = i; /* set first/last each row */
p[i] = a[i]; /* set pointer to each row */
}
现在您可以使用参数为指针到指针的函数交换指针,例如
void swpptr (int **a, int **b) /* swap pointers */
{
void *tmp = *a;
*a = *b;
*b = tmp;
}
与,例如:
puts ("\nswapping every other row...");
for (int i = 1; i < MAXI; i+=2) /* loop */
swpptr (&p[i-1], &p[i]); /* swap every other row */
一个简短的例子是:
#include <stdio.h>
#include <stdlib.h>
#define MAXI 10
void swpptr (int **a, int **b) /* swap pointers */
{
void *tmp = *a;
*a = *b;
*b = tmp;
}
void prn_ptr2ptr (int **p, int n) /* print n int per-pointer */
{
for (int i = 0; i < MAXI; i++) {
for (int j = 0; j < n; j++)
printf (" %d", p[i][j]);
putchar ('\n');
}
}
int main (void) {
int (*a)[MAXI] = calloc (MAXI, sizeof *a), /* pointer to array */
*p[MAXI]; /* array of pointers */
for (int i = 0; i < MAXI; i++) { /* loop */
*a[i] = i, a[i][MAXI-1] = i; /* set first/last each row */
p[i] = a[i]; /* set pointer to each row */
}
puts ("pre-swap:"); /* ouput pre-swap pointers */
prn_ptr2ptr (p, MAXI);
puts ("\nswapping every other row...");
for (int i = 1; i < MAXI; i+=2) /* loop */
swpptr (&p[i-1], &p[i]); /* swap every other row */
puts ("\npost-swap:"); /* output post-swap pointers */
prn_ptr2ptr (p, MAXI);
}
例子Use/Output
$ ./bin/ptr2arrayswap
pre-swap:
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 0 0 2
3 0 0 0 0 0 0 0 0 3
4 0 0 0 0 0 0 0 0 4
5 0 0 0 0 0 0 0 0 5
6 0 0 0 0 0 0 0 0 6
7 0 0 0 0 0 0 0 0 7
8 0 0 0 0 0 0 0 0 8
9 0 0 0 0 0 0 0 0 9
swapping every other row...
post-swap:
1 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 3
2 0 0 0 0 0 0 0 0 2
5 0 0 0 0 0 0 0 0 5
4 0 0 0 0 0 0 0 0 4
7 0 0 0 0 0 0 0 0 7
6 0 0 0 0 0 0 0 0 6
9 0 0 0 0 0 0 0 0 9
8 0 0 0 0 0 0 0 0 8
检查一下,如果您有任何问题,请告诉我。