结构体值传递传入函数为什么可以改变实参?

struct hero
{ string name; int age; string sex;};
//冒泡排序
void bubbleSort(hero arr[] , int len)
{ for (int i = 0; i < len - 1; i++)
{ for (int j = 0; j < len - 1 - i; j++)
{ if (arr[j].age > arr[j + 1].age)
{ hero temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//打印数组
void printHeros(hero arr[], int len)
{ for (int i = 0; i < len; i++)
{ cout << "姓名: " << arr[i].name << " 性别: " << arr[i].sex << " 年龄: " << arr[i].age << endl;
}
}

int main()
{
struct hero arr[5] = { {"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"},
};
int len = sizeof(arr) / sizeof(hero); //获取数组元素个数 bubbleSort(arr, len); //排序
printHeros(arr, len); //打印
system("pause");
return 0;
}

这是数组传递,数组相当于指针,所以可以修改
如果只是传递结构变量,那么不可以修改

你这个明显传的是结构体数组,传递数组名,实际上就是传了结构体的指针,操作这个指针是可以修改到原值的