我尝试编写 2 个子程序来按升序和降序排列数组,但它给了我指针和强制类型转换的问题。有办法解决这个问题吗?
我尝试将所有代码放入一个大程序中,它运行得完美无缺。 我尝试在子程序中强制转换指针,但没有成功。
#include <stdio.h>
#include <math.h>
void arrangef (int a[]){
int i, j, temp;
for (i=0;;i++){
for (j=1;;j++){
if (a[i]>a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
void arrangeb (int a[]){
int i, j, temp;
for (i=0;;i++){
for (j=1;;j++){
if (a[i]>a[j]) {}
else {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
int main () {
int i, n;
printf("What is the size of your array?\t"); scanf("%d",&n);
int a[n];
for (i=0;i<n;i++) {
printf("\nInsert element #%d of array\t",i+1); scanf("%d",&a[i]);
}
printf("\n\n");
for (i=0;i<n;i++) {
printf("%d\t",a[i]);}
printf("\n");
arrangef(a[n]);
for (i=0;i<n;i++) {
printf("%d\t",a[i]);}
printf("\n");
arrangeb(a[n]);
for (i=0;i<n;i++) {
printf("%d\t",a[i]);
}
}
我希望输出是 3 个数字列表,原始列表、升序排列和降序排列,但程序崩溃了。
最佳答案
要将数组传递给函数,只需指定数组名称1:
arrangef( a );
...
arrangeb( a );
a[n]
指定数组的单个元素,并且它是数组中最后一个元素之后的一个元素,因此您传递了错误的表达式类型(arrange*
函数需要 int *
,您正在传递 int
)并且它超出了数组的范围,因此该值是不知道。
除非它是 sizeof
或一元 &
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则 “T
的 N 元素数组”类型的表达式 转换(“衰减”)为“指向 T
的指针”类型的表达式,并且值表达式的地址是数组第一个元素的地址。
所以当你打电话时
arrangef( a );
表达式a
从“n
元素数组int
”隐式转换为“指向int
的指针” >”,而表达式的值就是a[0]
的地址,所以arrangef
实际接收到的是一个指针值。
在函数参数声明中,T a[N]
和 T a[]
被“调整”为 T *a
- 所有其中三个将 a
声明为指向 T
的指针。
由于函数接收的所有内容都是数组第一个元素的地址,因此您还必须将元素数量作为单独的参数传递,或者一个元素必须包含标记数据结尾的哨兵值(例如字符串中的 0 终止符)。在您的情况下,您需要单独传递尺寸:
void arrangef( int *a, size_t n ) // or int a[]
{
for ( int i = 0; i < n; i++ ) // don't loop past the last element in the array
{
for ( int j = i; j < n; j++ )
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
arrangeb
看起来是一样的,只是顺序不同。
for( i = 0; ; i++ )
将“永远”循环 - 它将循环越过数组末尾并最终进入不属于您的内存,从而导致运行时错误。 i
最终也会溢出,并且有符号整数溢出的行为没有明确定义。基本上,这个循环将会爆炸。
- 实际上,您可以传递任何数组类型的表达式,它会转换为指针类型,但现在我们只使用名称。
关于c - 有没有办法在返回数组时不使用指针? (警告: passing argument 1 of 'arrangef' makes pointer from integer without a cast.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56448605/