# 2018q3 Homework1 contributed by < [`GOGOGOGOGOGOG`](https://github.com/GOGOGOGOGOGOG) > ## 你所不知道的c語言學習紀錄 * [你所不知道的 C 語言: 指標篇重點整理](https://hackmd.io/B44cCPnaQCSRHkmJB3Zruw#) :::danger 將問題「充分敘述」後 (參見「提問的智慧」),列在下方,這樣才好追蹤 :notes: jserv ::: 關於qsort指令之運用 === :::danger 請使用繁體中文慣用術語: * pointer => 指標 * array => 陣列 * byte => 位元組 * function => 函式 (在不是數學領域時) 就算是轉錄的文章,也要改為繁體中文術語,請尊重台灣科技產業的傳統 :notes: jserv ::: `void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));` 參數 base => 這就是指標的數組的第一個元素進行排序。(給予一段記憶體位置) compar => 這個函式比較兩個元素。(宣告一單位有多大) nitems => 這是由基底指向的陣列中的元素數目。(數量以及單位大小) size => 這是在陣列中的每個元素的大小(以字元為單位)。(謝謝老師的提醒) qsort 函式說明 **->>需要 `#include<stdlib.h>`** 返回值 **這個函式沒有返回值。** 意義:依據一cpmparison func來進行排序,其中有三種形式:大於零,小於零,等於零 # 例子 ```C #include <stdio.h> #include <stdlib.h> int values[] = { 88, 56, 100, 2, 25 }; int cmpfunc (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int main() { int n; printf("Before sorting the list is: "); for( n = 0 ; n < 5; n++ ) { printf("%d ", values[n]); } qsort(values, 5, sizeof(int), cmpfunc); printf(" After sorting the list is: "); for( n = 0 ; n < 5; n++ ) { printf("%d ", values[n]); } return(0); } ``` # 執行結果 Before sorting the list is: 88 56 100 2 25 After sorting the list is: 2 25 56 88 100 關於指標的解讀 === 透過規格書 c99 [6.2.5] type 得知:pointer type的定義有: a function type, an object type, or an incomplete type(不完整之型態也有指標!)被稱為referenced type,referenced type去建立一個以微積分導數做概念的型態 **incomplete type** 我們可以對其進行宣告,但我們不能對incomplete type4去真正建立一物件,因為物件要佔用空間,但是我們可以宣告甚至建立一個pointer type **例如:** ```C struct Graphicsobject x; //error struct Graphicsobject *x; // ok int main() { char A; char *ptrA = &A char *ptrX = ptrA; ptrA++; ptrA-- } ``` 關於 incomplete type 的應用 === (練習題) 設定絕對地址為 0x67a9 的 32-bit 整數變數的值為 0xaa6,該如何寫? (0x67a9) = 0xaa6; //無法編譯 但是透過不完整型態,我們先轉成pointer type的object type,建立一個pointer to integer的32位元函數,所以變成: (int32_t * const) (0x67a9) = 0xaa6; 但這樣還是無法編譯的,這樣寫只是一個指標,需要再加一個value of operator(*)形成---Lvalue以存取的字元,即可寫入一個位址進去,這裡的'='是指指派的意思