夜深了,有點煩,就分享一下關于選擇排序和陣列作為函式引數的一個例題吧,希望對有需要的伙伴有一點點幫助吧,
**題目:用選擇法對10個整數進行由大到小的排序,**
#include<stdio.h>
void sort(int *x,int n)
{ int *x_end,*m,u,*p;
x_end=x+n;
int i;
for(;x<x_end-1;x++)
{ p=x;
for(m=x+1;m<x_end;m++)
{
if(*m>*p)
p=m;
}
if(p!=x)
{
u=*x;
*x=*p;
*p=u;
}
}
} int main(void)
{
int a[10],n,*p;
printf("請輸入十位資料\n");
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
n=10;
sort(a,10);
p=a;
for(p;p<a+10;p++)
{
printf("%d ",*p);
}
return 0;
}
#include<stdio.h>
void sort(int *x,int n)
//這是陣列作為函式引數所設的指標變數,這里也可以直接設陣列如:(int x[ ] ,int n).有關陣列轉換對于形參和實參的要求我會在下面作為補充,//
{ int *x_end,*m,u,*p;
//這是先申明幾個指標變數作為備用//
x_end=x+n;
//這是對指標進行一個上線的設定,至于為啥會單獨用一個指標變數來表示,這是為了保證原來的傳的陣列會被改變,因為下面x是作為變數來變的,//
int i;
for(;x<x_end-1;x++)
//至于為啥這里會減一,這是因為a+10=a[10],避免下面陣列越界,為什么這么說呢?是因為m=x+1,一旦x可以取到9則m可以取到10,則陣列越界,而且作為選擇法其實也只需要n-1次大的回圈就好了,//
{ p=x;
for(m=x+1;m<x_end;m++)
{
if(*m>*p)//這里是間接訪問來比較值的大小,如果未有看過指標的運算可以先去看看,要不然可能這里會有些糊涂,//
p=m;//這里直接進行地址賦值,//
}
if(p!=x)
{
u=*x;
*x=*p;
*p=u;//有的同學會問了,為啥這里不能直接換地址呢,因為陣列作為函式引數,在進行址傳遞是形參和實參共用一段記憶體空間的因此修改形引陣列元素的值實際上改變的是實引陣列的值,而地址是共用的,不能改變,但是指標指向變數的值是可以改變的,也就是說地址不變,但站在地址上面的值我是可以改變的,我通過地址傳遞改變上面的值,類似于我們檔案的在線編輯,我把賬號公用你,無論在哪里賬號不會改變但是賬號里的資訊我是可以改變的,//
}
}
} int main(void)
{
int a[10],n,*p;
printf(“請輸入十位資料\n”);
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);//簡單的輸入//
}
n=10;
sort(a,10);
p=a;/為啥還要單獨用個指標變數,這是因為a是不變數,我要借用p這個變數,那有人會問那為啥上面x是變數a,那是因為x是形參,起到一個傳遞地址的作用,是一個指標變數,而我們這里是陣列名是常量,不可以變的,/
for(p;p<a+10;p++)
{
printf("%d ",*p);
}
return 0;
}
有關陣列轉換對于形參和實參的要求如下,如果主調函式有一個陣列,想在被調函式改變此陣列的值,被調函式的實參與形參定義如以下集中情形:
- 形參定義為陣列,實參用陣列名;
- 形參定義為指標變數,實參用陣列名;
- 實參與形參都用指標變數;
- 形參定義為陣列,實參用指標變數;
- (陣列形式int *x[ ] 指標形式 int *x)
早點休息吧everyone,祝大家期末不掛科,績點滿績喲,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238023.html
標籤:其他
下一篇:摸不著頭腦的一周
