我想编写一个程序,其中包含在函数内使用指针进行冒泡排序。 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
void rendez(int* t, int n){
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(*t+i<*t+j){
int temp = *t+i;
*t+i = *t+j;
*t+j = temp;
}
}
}
}
int main(){
setlocale(LC_ALL,"");
int t[10] = {2,3,4,5,6,7,8,9,10,11};
rendez(&t,sizeof(t));
printf("\n");
system("pause");
}
它给我这些错误:
C:\Users\metal\gyakorlás1211.cpp In function 'void rendez(int*, int)':
C:\Users\metal\gyakorlás1211.cpp [Error] lvalue required as left operand of assignment
C:\Users\metal\gyakorlás1211.cpp [Error] lvalue required as left operand of assignment
C:\Users\metal\gyakorlás1211.cpp In function 'int main()':
C:\Users\metal\gyakorlás1211.cpp [Error] cannot convert 'int (*)[10]' to 'int*' for argument '1' to 'void rendez(int*, int)'
谢谢!
最佳答案
你需要做的两个改变
if(*(t+i)<*(t+j)){
int temp = *(t+i);
*(t+i) = *(t+j);
*(t+j) = temp;
}
还有
rendez(t,sizeof(t)/sizeof(t[0]));
现在看看你之前做了什么,首先你的编译器一定已经爆发了很多警告。
&t
是 int (*)[10]
,这不是您想要的。
相反,您只是想传递最终会衰减为指针的数组,然后您所做的任何更改都会反射(reflect)到数组中。
早些时候您的*t+i
正在做这样的事情,(*t)+i
是您想要的吗?而且 t
当时是 int(*)[10]
所以你基本上是添加 i
或 j
.这是不对的。您正在处理地址,但您想处理值。
函数的第二个参数,您想传递数组的大小,但不是字节数,而是元素数。
sizeof (arr)
基本上是说 10*sizeof(int)
因为它包含 int
。但这是你想要的吗?不,你想传递 int
元素的数量。所以只需将它除以每个 int
的大小。这就是我们在 sizeof(t)/sizeof(t[0])
中所做的。
关于C++ 带指针的冒泡排序函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47760473/