C++ 带指针的冒泡排序函数

标签 c++ function pointers bubble-sort

我想编写一个程序,其中包含在函数内使用指针进行冒泡排序。 这是我的代码:

#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])); 

现在看看你之前做了什么,首先你的编译器一定已经爆发了很多警告。

&tint (*)[10],这不是您想要的。

相反,您只是想传递最终会衰减为指针的数组,然后您所做的任何更改都会反射(reflect)到数组中。

早些时候您的*t+i 正在做这样的事情,(*t)+i 是您想要的吗?而且 t 当时是 int(*)[10] 所以你基本上是添加 ij .这是不对的。您正在处理地址,但您想处理值。

函数的第二个参数,您想传递数组的大小,但不是字节数,而是元素数。

sizeof (arr) 基本上是说 10*sizeof(int) 因为它包含 int。但这是你想要的吗?不,你想传递 int 元素的数量。所以只需将它除以每个 int 的大小。这就是我们在 sizeof(t)/sizeof(t[0]) 中所做的。

关于C++ 带指针的冒泡排序函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47760473/

相关文章:

c++ - 如何为 boost::variant 实现算术运算符,使其支持不同的数字类型

c - 编译后忽略部分代码

c - C 中的指针 - 一维和二维

javascript - 如何在javascript函数中传递参数

C++ 剪切字符指针

c - 当用 %d 打印 int 指针时打印出什么?

c++ - 如何删除 GDB 中的捕获点

c++ - C++中将stdin的内容读入字符串或 vector 的最快方法

c++ - 在 C++11 时钟之间转换

javascript - Chrome/Firefox 中的 Rect 函数有什么用?