将数组传递给 C 语言中的排序函数
-
20-12-2019 - |
题
#include<stdio.h>
#include<conio.h>
float smallest(int arr[],int k,int n);
void sort(int arr[],int n);
void main()
{
int arr[20],i,n,j,k;
clrscr();
printf("\nEnter the number of elements in the array: ");
scanf("%d",&n);
printf("\nEnter the elements of the array");
for(i=0 ; i < n ; i++)
{
printf("\n arr[%d] = ",i);
scanf("%d",&arr[i]);
}
sort(arr,n);
printf("\nThe sorted array is: \n");
for(i=0 ; i < n ; i++)
printf("%d\t",arr[i]);
getch();
}
int smallest(int arr[],int k,int n)//smallest function
{
int pos=k,small=arr[k],i;
for(i=k+1;i<n;i++)
{
if(arr[i]<small)
{
small=arr[i];
pos=i;
}
}
return pos;
}
void sort(int arr[],int n)//sorting function
{
int k,pos,temp;
for(k=0 ; k < n ; k++)
{
pos=smallest(arr,k,n);
temp=arr[k];
arr[k]=arr[pos];
arr[pos]=temp;
}
}
在上面的程序中,排序函数是从 main 调用的,但返回类型为 sort
为 void,但它仍然返回排序后的数组。在对数组进行排序后,函数应该将排序后的数组返回给调用函数以打印排序后的数组,但程序运行完美。这是怎么回事?
解决方案
当你声明
int arr[20];
你可以说“arr 是一个由 20 个整数组成的数组”。但 arr 也是一个指向整数的指针,指向 20 行中的第一个整数。所以取消引用 *arr
是一个整数,与 arr[0]
实际上。
这意味着当你通过 arr
对于一个函数,您只需传递一个指向该函数的指针。本例中的函数作用于(复制的)指针。但是这个指针恰好指向与原始内存相同的内存 arr
声明于 main()
. 。这就是操纵的原因 arr
在 sort()
事实上是在操纵 arr
在 main()
.
其他提示
当传递数组作为参数时,这
int smallest(int arr[],int k,int n)
意思完全一样
int smallest(int *arr,int k,int n)
例如
#include<iostream>
void printArray(int data[])
{
for(int i = 0, length = sizeof(data); i < length; ++i)
{
std::cout << data[i] << ' ';
}
std::cout << std::endl;
}
int main()
{
int data[] = { 5, 7, 8, 9, 1, 2 };
printArray(data);
return 0;
}
您将看到仅打印了数组的前 4 个元素。这 sizeof(data)
返回值 4!这恰好是用于将数组传递给的指针的大小 printArray()
。首先,数组不会被复制。复制指向数组第一个元素的指针
首先,在任何函数参数之间没有连接,或者未使用具有根据函数返回类型的表达式的return
语句传递的连接。
虽然C包括C的所有参数是viaply - 复制到“本地参数变量”的值 - 没有任何内容在内存位置处发生的内容A 指针即可参考。因此,即使不返回值,函数也可以在调用环境中进行任何更改。
声明为生成的参数是生成的。这仅仅是aType name[]
的句子糖。
不隶属于 StackOverflow