在c中交换两个结构

时间:2017-10-05 18:55:00

标签: c pointers swap

您好我正在尝试创建一个交换函数来交换结构的前两个元素。有人可以告诉我如何使这项工作。

void swap(struct StudentRecord *A, struct StudentRecord *B){
    struct StudentRecord *temp = *A;
    *A = *B;
    *B = *temp;
}


struct StudentRecord *pSRecord[numrecords];

for(int i = 0; i < numrecords; i++) {

pSRecord[i] = &SRecords[i];

}

printf("%p \n", pSRecord[0]);
printf("%p \n", pSRecord[1]);

swap(&pSRecord[0], &pSRecord[1]);

printf("%p \n", pSRecord[0]);
printf("%p \n", pSRecord[1]);

2 个答案:

答案 0 :(得分:5)

表达式*A的类型为struct StudentRecord,而名称temp的类型为struct StudentRecord *。那是temp是一个指针。

因此在本声明中初始化

struct StudentRecord *temp = *A;

没有意义。

相反,你应该写

struct StudentRecord temp = *A;

结果该功能看起来像

void swap(struct StudentRecord *A, struct StudentRecord *B){
    struct StudentRecord temp = *A;
    *A = *B;
    *B = temp;
}

考虑到原始指针本身没有改变。它是指针指向的对象,将被更改。

因此应该像

一样调用该函数
swap(pSRecord[0], pSRecord[1]);

如果你想交换指针本身,那么函数看起来像

void swap(struct StudentRecord **A, struct StudentRecord **B){
    struct StudentRecord *temp = *A;
    *A = *B;
    *B = temp;
}

在本声明中

swap(&pSRecord[0], &pSRecord[1]);
你确实试图交换指针。

答案 1 :(得分:2)

首先,你的片段中没有结构,只是指向结构的指针。因此,您在那里所做的一切都是尝试交换指针,而不是结构值。

Struct通常占用内存中的多个字节。指针是包含该存储器地址的变量。它还占用一些内存,即64位地址的8个字节。

以下是指向struct对象的指针数组。

struct StudentRecord *pSRecord[numrecords];

使用struct对象数组中的地址初始化。

此调用看起来像是尝试将指针交换到数组中的结构。你做得对。

swap(&pSRecord[0], &pSRecord[1]);

但是由于pSRecord [i]已经是指向结构的指针,并且您获取指针&的地址,因此生成的对象将指向指向结构的指针。因此,您的交换功能需要**,如下所示。其余的代码是正确的:

void swap(struct StudentRecord **A, struct StudentRecord **B) {
    struct StudentRecord *temp = *A;
    *A = *B;
    *B = *temp;
}