我想编写一个包含函数内部指针的冒泡排序的程序。 这是我的代码:
#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)'
谢谢!
答案 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]));
现在看看你之前做过的事情,首先你的编译器必须发出很多警告。
&t
是int (*)[10]
,这不是您想要的地方。
而你只是想传递最终会衰变成指针的数组,然后你做的任何更改将反映到数组。
早些时候*t+i
正在做这样的事情,(*t)+i
这就是你想要的吗?此外t
已int(*)[10]
,因此您基本上会向其中添加i
或j
。这不对。您正在处理地址,但您希望使用值。
函数的第二个参数,你想传递数组的大小,但不是字节数,而是元素数。
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
该功能确实实现了冒泡排序算法。