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

时间:2017-12-11 19:58:14

标签: 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)'

谢谢!

3 个答案:

答案 0 :(得分:1)

您需要进行两项更改

      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],这不是您想要的地方。

而你只是想传递最终会衰变成指针的数组,然后你做的任何更改将反映到数组。

早些时候*t+i正在做这样的事情,(*t)+i这就是你想要的吗?此外tint(*)[10],因此您基本上会向其中添加ij。这不对。您正在处理地址,但您希望使用值。

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

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

答案 1 :(得分:0)

当你在参数中发送&t时,你实际上并没有发送数组的第一个地址,而是发送整个数组的地址。

  

让我们理解这件事
  我们假设数组被分配为 1000,1004,1008。   所以,   第一个元素的地址将 1000 ,当您在其中添加1时,它将为您提供 1004 。   并且整个数组的地址将 1000 ,因为当你在其中加1时,它将给出数组中最后一个元素的下一个地址。

t是指向第一个元素的指针,&t是指向数组的指针。 因此,要将数组传递给另一个函数,只需在参数中发送t

现在,sizeof运算符不返回数组的长度,而是返回它分配的大小。

阅读this并将您的函数调用编写为。

rendez(t, sizeof(t)/sizeof(t[0]));

现在关于lvalue错误。

*的优先级高于+,因此*首先执行。 所以这样写*t + i会给你第一个元素的第一个元素。
所以你需要写得像 分配操作中*(t + i)

答案 2 :(得分:0)

此次电话

rendez(&t,sizeof(t)); 

是错误的,因为表达式&t的类型为int (*)[10],而不是类型int *,它是函数rendez的第一个参数的类型。

您应该调用类似

的功能
rendez( t, sizeof(t) / sizeof( *t ) ); 

函数的第二个参数应该是size_t类型。

也在函数if if语句

        if(*t+i<*t+j){
            int temp = *t+i;
            *t+i = *t+j;
            *t+j = temp;
        }

也错了。

必须看起来像

        if( *( t + i ) < *( t + j ) ){
            int temp = *( t + i );
            *( t + i ) = *( t + j );
            *( t + j ) = temp;
        }

考虑到冒泡排序算法会比较相邻元素。

您的函数实现看起来效率低下。

如果您只想使用指针,那么该功能可以看起来像在演示程序中显示的那样

#include <iostream>

void rendez( int *a, int n )
{
    for ( int *first = a, *swapped = a, *last = a + n; !( last - first < 2 ); first = a, last = swapped )
    {
        swapped = a;
        while ( ++first != last )
        {
            if ( *( first - 1 ) < *first )
            {
                swapped = first;
                int tmp = *first;
                *first = *( first - 1 );
                *( first - 1 ) = tmp;
            }
        }
    }        
}


int main() 
{
    int a[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;

    rendez( a, sizeof( a ) / sizeof( *a ) );

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

它的输出是

2 3 4 5 6 7 8 9 10 11 
11 10 9 8 7 6 5 4 3 2 

该功能确实实现了冒泡排序算法。