c++ 数组作为参数传入函数为什么数组元素变成一样的了?

#include<iostream>
#include<string>
#include<math.h>
using namespace std;
struct hero
{
    string name;
    int age;
    string sex;
    
};
void maopao(struct hero a[],int len)//冒泡排序 
{
    for(int i=0;i<len-1;i++)
    {
        for(int j=0;j<len-1-i;j++)
        {
            if(a[j].age>a[j+1].age)
            {
                struct hero temp=a[j];
                a[j]=a[j+i];
                a[j+1]=temp;
            }
        }
    }
}
void b(struct hero a[],int len)
{
        for(int k=0;k<len;k++)
    {
        cout<<a[k].name<<a[k].age<<a[k].sex<<endl;
    }
}
int main()
{
    struct hero a[5]=
    {
        {"刘备",23,"男" },
        {"张飞",22,"男" },
        {"赵云",21,"男" },
        {"关羽",22,"男" },
        {"貂蝉",19,"女" },        
    };
    int len=sizeof(a)/sizeof(a[0]);
    maopao(a,len);
     for(int i=0;i<5;i++)
     {
         cout<<a[i].name<<a[i].age<<a[i].sex<<endl;
     }
    b(a,len);
    return 0;
}

这是一个算法问题。你写的冒泡程序算法不对。

  1. 函数的名字最好用英文命名。
  2. 最好先读懂冒泡程序的算法原理,再仔细编写。
  3. 另外,C++ 里面,struct 和 class 一样,声明变量名的时候不需要像C语言一样带上`struct`关键字。

 

不过,如果你想知道你的程序为什么跑一遍后数组的元素都变成一样了?那么你可以通过单元测试的方式检验你的代码正确性。做法原理是:先跑一小段代码,看看它的结果正确吗?和你的假设一样吗?如果不一样,是为什么呢?

 

例如,把你的冒泡算法改成如下代码,执行后就数组的元素都变成一样了,你想想为什么? 

void maopao(struct hero a[], int len)//冒泡排序 
{
    int i = 0;
    //for (int i = 0; i < len - 1; i++)
    //{
        for (int j = 0; j < len - 1 - i; j++)
        {
            if (a[j].age > a[j + 1].age)
            {
                struct hero temp = a[j];
                a[j] = a[j + i];
                a[j + 1] = temp;
            }
        }
    //}
}

这个一遍执行的结果,数组元素已经都变成一样了,那么,外层的for循环也就没有意义。

    struct hero temp=a[j];
                a[j]=a[j+i];//这里写错了 a[j]=a[j+1]
                a[j+1]=temp;