我对双指针作为交换函数的参数有疑问
I have doubts about double pointer as parameters for a swap function
希望你能帮帮我!我将此函数添加到我的 array.c 中以随机排列数组元素,它适用于 static Item *a;静态暗淡;在我的 array.c.
static Item *a;
static int dim = 3;
a=malloc( dim * sizeof(Item);
void random_array() {
int i , j;
Item t;
for (i = dim - 1;i > 0; i--)
{
j = rand() % (i + 1);
t = a[i];
a[i] = a[j];
a[j] = t;
//swap(a[i], a[j]);
}
}
item.h
typedef void *Item;
项目-int.c
#include <stdio.h>
#include <stdlib.h>
#include "item.h"
Item inputItem(){
int *p;
p=malloc(sizeof(int));
scanf("%d",p);
return p;
}
void outputItem(Item item){
int *p;
p=item;
printf("%d ",*p);
}
int cmpItem(Item item1,Item item2){
int *p1,*p2;
p1 = item1;
p2 = item2;
return *p1 - *p2;
}
所以我尝试使用文件 utils.c 中的函数交换 (a[i], a[j]) 但它不起作用。
void swap (Item pa, Item pb) {
Item t;
t = pa;
pa = pb;
pb = t;
}
它适用于这些指令:
void swap (Item *pa, Item *pb)
{
Item t;
t = *pa;
*pa = *pb;
*pb = t;
}
我知道使用“typedef void *Item”,项目 t 就像 void *t 而项目 *a 就像 void **a,对吗?
因此,由于 a=malloc(numberelements*(sizeof(Item)); 和 a[i]=malloc(sizeof(Item) 每个指针都指向一个包含许多字节的内存位置,因此使用双指针我有一个包含许多指针的动态数组?
Here a image.
所以对于 t 我不需要 malloc 因为 t = a[i] t 指向从 a[i] 指向的内存位置,对吧?
如果是,为什么我必须在交换函数中使用 t = *pa 等而不是 t = pa ?我对双指针作为函数参数有几个疑问。我希望你能解决这个问题。提前致谢!
好的,让我们从这里开始:
typedef int Item; // Always get this backwards, need to check...
void swap (Item *pa, Item *pb)
{
Item t;
t = *pa;
*pa = *pb;
*pb = t;
}
void foo()
{
Item i= (Item), j=(Item)2; // These casts are not needed, but help later explanations
// Must take address so swap can change original values of i and j.
swap(&i, &j);
Item *ip = &i;
Item *jp = &j;
// This also works because we do the dereference above.
swap(ip, jj);
}
两者都可以。怎么样?
typedef int******* Item;
void swap (Item *pa, Item *pb)
{
Item t;
t = *pa;
*pa = *pb;
*pb = t;
}
void foo()
{
Item i= (Item)1, j=(Item)2;
// Must take address so swap can change original values of i and j.
swap(&i, &j);
int *ip = &i;
int *jp = &j;
// This also works because we do the dereference above.
swap(ip, jp);
}
同样,类型并不重要。这就是它的使用方式。如果您忘记了 &
,编译器会警告您类型不匹配。
希望你能帮帮我!我将此函数添加到我的 array.c 中以随机排列数组元素,它适用于 static Item *a;静态暗淡;在我的 array.c.
static Item *a;
static int dim = 3;
a=malloc( dim * sizeof(Item);
void random_array() {
int i , j;
Item t;
for (i = dim - 1;i > 0; i--)
{
j = rand() % (i + 1);
t = a[i];
a[i] = a[j];
a[j] = t;
//swap(a[i], a[j]);
}
}
item.h
typedef void *Item;
项目-int.c
#include <stdio.h>
#include <stdlib.h>
#include "item.h"
Item inputItem(){
int *p;
p=malloc(sizeof(int));
scanf("%d",p);
return p;
}
void outputItem(Item item){
int *p;
p=item;
printf("%d ",*p);
}
int cmpItem(Item item1,Item item2){
int *p1,*p2;
p1 = item1;
p2 = item2;
return *p1 - *p2;
}
所以我尝试使用文件 utils.c 中的函数交换 (a[i], a[j]) 但它不起作用。
void swap (Item pa, Item pb) {
Item t;
t = pa;
pa = pb;
pb = t;
}
它适用于这些指令:
void swap (Item *pa, Item *pb)
{
Item t;
t = *pa;
*pa = *pb;
*pb = t;
}
我知道使用“typedef void *Item”,项目 t 就像 void *t 而项目 *a 就像 void **a,对吗? 因此,由于 a=malloc(numberelements*(sizeof(Item)); 和 a[i]=malloc(sizeof(Item) 每个指针都指向一个包含许多字节的内存位置,因此使用双指针我有一个包含许多指针的动态数组?
Here a image.
所以对于 t 我不需要 malloc 因为 t = a[i] t 指向从 a[i] 指向的内存位置,对吧? 如果是,为什么我必须在交换函数中使用 t = *pa 等而不是 t = pa ?我对双指针作为函数参数有几个疑问。我希望你能解决这个问题。提前致谢!
好的,让我们从这里开始:
typedef int Item; // Always get this backwards, need to check...
void swap (Item *pa, Item *pb)
{
Item t;
t = *pa;
*pa = *pb;
*pb = t;
}
void foo()
{
Item i= (Item), j=(Item)2; // These casts are not needed, but help later explanations
// Must take address so swap can change original values of i and j.
swap(&i, &j);
Item *ip = &i;
Item *jp = &j;
// This also works because we do the dereference above.
swap(ip, jj);
}
两者都可以。怎么样?
typedef int******* Item;
void swap (Item *pa, Item *pb)
{
Item t;
t = *pa;
*pa = *pb;
*pb = t;
}
void foo()
{
Item i= (Item)1, j=(Item)2;
// Must take address so swap can change original values of i and j.
swap(&i, &j);
int *ip = &i;
int *jp = &j;
// This also works because we do the dereference above.
swap(ip, jp);
}
同样,类型并不重要。这就是它的使用方式。如果您忘记了 &
,编译器会警告您类型不匹配。