陣列排序及陣列做函式引數將會退化為指標

2021-08-07 19:28:58 字數 1608 閱讀 6831

陣列排序

1.選擇排序思想

2.選擇排序初級**

#include

#include

int main()

int a[10] = ;

int k = 0;

int j = 0, i = 0, temp = 0;

printf("排序前\n"); //排序前列印輸出

for (k = 0; k <10; k++)

printf(" %d", a[k]);

printf("\n");

for(i = 0; i <10; i++) //外層迴圈控制行迴圈

for(j = 1+i; j <10; j++ ) //內層迴圈控制行內迴圈

if (a[i] < a[j])

temp = a[i];

a[i] = a[j];

a[j] = temp;

printf("排序後\n");//排序前列印輸出

for (k = 0; k <10; k++)

printf(" %d", a[k]);

printf("\n");

system("pause");

優化列印**,每次列印乙個陣列都需要寫乙個for迴圈這樣太麻煩了,可以優化一下

定義乙個列印函式

void arrayout(int *a) //第一步優化

int k = 0;

for (k = 0; k <10; k++)

printf(" %d", a[k]);

printf("\n");

結論:雖然把陣列列印封裝成了函式但是**中的k <10,指定了陣列的大小為10,實際應用中陣列元素可能不為10

void arrayout(int *a,int num) //第二步優化

int k = 0;

for (k = 0; k printf(" %d", a[k]);

printf("\n");

結論:在函式引數裡傳入乙個陣列大小的變數,這樣函式引數又變多了,還可以再進一步優化

//1.陣列做函式引數會退化為指標

//2.雖然在函式引數中定義了乙個陣列,但是編譯器還是把它當做指標不會給他分配記憶體

//即在形參裡面出現char buf[30] 或者 int a[20] c/c++編譯器會把它當做乙個指標也不會主動的多分配記憶體

//函式引數中定義的陣列資料型別為int 佔四個位元組

void arrayout1(int a[10]) //第三步錯誤的優化

int k = 0;

int mm = sizeof(a[10]);

int num = sizeof(a[10])/ sizeof(*a);

for (k = 0; k printf(" %d", a[k]);

printf("\n");

結論:1.陣列做函式引數時會退化為指標

2.陣列做函式引數後再用sizeof求陣列的大小,這時大小便為int型別 實質是陣列型別不一致

陣列做函式引數

陣列名是陣列元素首位址,可以直接當做實參,可以用指標或方式來當形參接收,都是位址傳遞,形參都是指標方式 include void input int arr void output int arr 這裡得出的大小是4個位元組,證明形參是指標形式 printf n d sizeof arr void ...

排序熱身及陣列做函式引數退化為指標引申

先說排序比較常用的是氣泡排序 先介紹個簡單的 氣泡排序的原理就是先獲取到每個陣列的元素 然後迴圈的和自己下乙個去比較 判斷是否大於還是小於 之後做下替換 例 int number 5 先定義乙個陣列 進行排序 for int i 0 i 5 i 他先拿著第乙個數字和下面乙個去比較 第一輪比較下來之後...

陣列名做函式引數

陣列名做函式引數 用陣列名做函式引數與用陣列元素作實參有幾點不同 1 用陣列元素作實參時,只要陣列型別和函式的形參變數的型別一致,那麼作為下標變數的陣列元素的型別也和函式形參變數的型別是一致的。因此,並不要求函式的形參也是下標變數。換句話說,對陣列元素的處理是按普通變數對待的。用陣列名作函式引數時,...