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()
を操作します。
他のヒント
アレイをパラメータとして渡す場合、この
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インを渡すすべてのパラメータが値によるものである間は、値を「ローカルパラメータ変数」にコピーします。メモリ位置A POINTER は何も想定されていません。参照。したがって、関数は、値を返すことなく、呼び出し環境の変更を加えることができます。
aType name[]
として宣言されているパラメータについて説明します。これはconst aType* name
のための単なる構文砂糖です。