如何在结构中交换数组的结构元素 - C

How to swap struct elements of array inside a struct - C

我有 2 个结构

typedef struct {
    int i;
    int p;
} item;

typedef struct {
    item items[10];
} buffer;

void swap (item** p1, item** p2) {
   item* temp = *p1;
  *p1 = *p2;
  *p2 = temp;
}

我正在尝试呼叫

    item *ps = &buffer.items[0];
    item *p = &buffer.items[1];

    swap(&ps, &p);

但它不是交换它们?我究竟做错了什么?谢谢 如果 struct buffer 在 main 或 global 中是局部的,会有什么变化吗?

谢谢

您可以交换指针但不能交换结构!

item item0, item1, item2, item3, item4, item5, item6, item7, item8, item9;

typedef struct {
    item * items[10] =  { &item0, &item1, &item2, &item3, &item4, &item5, &item6, &item7, &item8, &item9 };
} buffer;

item **ps = &(buffer.items[0]);
item **p = &(buffer.items[1]);

swap(ps, p);

您的函数只交换 指针 psp,而不交换它们指向的实际结构。为此,您需要复制结构,例如

void swap (item* p1, item* p2) {
   item temp = *p1;
  *p1 = *p2;
  *p2 = temp;
}

调用为

swap(&buffer.items[0], &buffer.items[1]);

我使用了一个结构数组并将它们与临时文件交换

#include<stdio.h>
#include<stddef.h>
#include<string.h>
typedef struct Ville{
    char name[25];
    long population;
}Ville;
Ville classerVille(Ville *p_list,int index);
int main(){
    Ville city_ranking[15];
    int number_of_city=0;
    strcpy(city_ranking[0].name,"Metz");
    city_ranking[0].population=11890;   
    number_of_city++;

    strcpy(city_ranking[1].name,"Nevers");
    city_ranking[1].population=33325;
    number_of_city++;

    strcpy(city_ranking[2].name,"Paris");
    city_ranking[2].population=2190327;
    number_of_city++;

    strcpy(city_ranking[3].name,"Reims");
    city_ranking[3].population=183113;
    number_of_city++;

    strcpy(city_ranking[4].name,"Lyon");
    city_ranking[4].population=515695;
    number_of_city++;

    classerVille(city_ranking,number_of_city);
    return 0;
}

Ville classerVille(Ville *p_list,int index){
    Ville temp;
    for(int i=0;i<index;i++){
        for(int j=i;j<index;j++){
            if(p_list[i].population>p_list[j].population){
                temp=p_list[i];
                p_list[i]=p_list[j];
                p_list[j]=temp;
            }
        }
    }
    return *p_list;
}