# 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以存取的字元,即可寫入一個位址進去,這裡的'='是指指派的意思