您好我正在尝试创建一个交换函数来交换结构的前两个元素。有人可以告诉我如何使这项工作。
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]);
答案 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;
}