#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;
}
}
在上面的程序中,sort函数是从main调用的,但sort
的返回类型是void,它仍然返回已排序的数组。在排序数组之后,函数应该将已排序的数组返回给调用函数以打印已排序的数组,但程序运行完美。这是怎么回事?
答案 0 :(得分:5)
宣布
时int arr[20];
你可以说“arr是一个包含20个整数的数组”。但是arr也是指向整数的指针,指向一行20中的第一个整数。因此,取消引用*arr
是一个整数,实际上与arr[0]
相同。
这意味着当您将arr
传递给函数时,您只传递指向该函数的指针。这种情况下的函数适用于(复制的)指针。但是这个指针指向与arr
中声明的原始main()
完全相同的内存。这就是为什么在arr
中操纵sort()
实际操纵arr
中main()
的原因。
答案 1 :(得分:4)
将数组作为参数传递时,
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()
的指针的大小。
首先,数组不会被复制。指向数组第一个元素的指针被复制
答案 2 :(得分:0)
首先,根据函数的返回类型,任何函数参数之间没有任何关联,或者没有使用return
语句和表达式传递。
虽然C中传递的所有参数都是值,但是将值复制到&#34;局部参数变量&#34; - 没有假设指针引用的内存位置会发生什么。因此,即使不返回值,函数也可以在调用环境中进行任何更改。
关于声明为aType name[]
的参数。这只是const aType* name
的语法糖。