你是对的——你必须将指针作为参数传递给int
你的交换函数。为什么?您想更改指针本身。传递一个简单的指针,该函数将收到一个副本,并且任何更改都将在返回时丢失。
这里的关键是你不能直接交换你分配的集合中的行而不使用memcpy
实际交换数据。为什么?这些行包含在您刚刚分配的顺序内存块中。您可以简单地声明一个指针数组,指向您分配的数据集合中每一行的开头,然后在指针数组中交换指针,例如
#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);
}
示例使用/输出
$ ./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
看看事情,如果你有任何问题,请告诉我。