1. 函式指標(function pointer):
函式指標是指向函式的指標變數,
通常我們說的指標變數是指向一個整型、字符型或陣列等變數,而函式指標是指向函式,
函式指標可以像一般函式一樣,用于呼叫函式、傳遞引數,
函式指標變數的宣告:
typedef int (*fun_ptr)(int,int);
例子:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
sub:指標函式是回傳指標的函式,詳見我上一篇文章,
2.回呼函式(Callback function):
函式指標變數可以作為某個函式的引數來使用的,回呼函式就是一個通過函式指標呼叫的函式,
"
以下是來自知乎作者常溪玲的解說:
你到一個商店買東西,剛好你要的東西沒有貨,于是你在店員那里留下了你的電話,過了幾天店里有貨了,店員就打了你的電話,然后你接到電話后就到店里去取了貨,在這個例子里,你的電話號碼就叫回呼函式,你把電話留給店員就叫登記回呼函式,店里后來有貨了叫做觸發了回呼關聯的事件,店員給你打電話叫做呼叫回呼函式,你到店里去取貨叫做回應回呼事件,
"
意思簡單來說就是:你現在定義的A函式的引數包含了一個你現在還不知道的B函式,所以你在引數中做了一個B函式指標以便參考這個B函式, 一旦參考的這個B函式被定義了,你就可以在runtime使用你的A函式,
例子:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
sub:size_t 是一種資料型別,近似于無符號整型,但容量范圍一般大于 int 和 unsigned,這里使用 size_t 是為了保證 arraysize 變數能夠有足夠大的容量來儲存可能大的陣列.
3.字串(string):
在 C 語言中,字串實際上是使用 null 字符 '\0' 終止的一維字符陣列,因此,一個以 null 結尾的字串,包含了組成字串的字符,
下面的宣告和初始化創建了一個 "Hello" 字串,由于在陣列的末尾存盤了空字符,所以字符陣列的大小比單詞 "Hello" 的字符數多一個,
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; (一般正常人不會用這種)(不需要把 null 字符放在字串常量的末尾,C 編譯器會在初始化陣列時,自動把 '\0' 放在字串的末尾,)
char greeting[] = "Hello"; (比較通用,和其他語言很像,注意“[ ]”,因為C里面string是char的array,)
常見操作:
strcpy(s1, s2); 復制字串 s2 到字串 s1,
strcat(s1, s2); 連接字串 s2,
strlen(s1); 回傳字串 s1 的長度,
strcmp(s1, s2); 如果 s1 和 s2 是相同的,則回傳 0;如果 s1<s2 則回傳小于 0;如果 s1>s2 則回傳大于 0,
strchr(s1, ch); 回傳一個指標,指向字串 s1 中字符 ch 的第一次出現的位置,
strstr(s1, s2); 回傳一個指標,指向字串 s1 中字串 s2 的第一次出現的位置,
sub:
strlen 與 sizeof的區別:
strlen 是函式,sizeof 是運算運算子,二者得到的結果型別為 size_t,即 unsigned int 型別,
sizeof 計算的是變數的大小,不受字符 \0 影響;
而 strlen 計算的是字串的長度,以 \0 作為長度判定依據,
4.結構體(struct):
a.定義:
C 陣列允許定義可存盤相同型別資料項的變數,結構是 C 編程中另一種用戶自定義的可用的資料型別,它允許記憶體儲不同型別的資料項,
假設我們有一個電子圖書館,我們可以用結構體來定義一本書及其屬性: 1.標題 2.作者,,,之類,
為了定義結構,您必須使用 struct 陳述句,struct 陳述句定義了一個包含多個成員的新的資料型別,struct 陳述句的格式如下:
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
在一般情況下,tag 、member-list、variable-list 這 3 部分(對應代碼里面的Books, char title[50]; , book)至少要出現 2 個,
sub :
1.不同的定義方式產生的結構體可以被視為不同的型別,無法相等(不管成員是不是一樣).
2.結構體的成員可以包含其他結構體,也可以包含指向自己結構體型別的指標,而通常這種指標的應用是為了實作一些更高級的資料結構如鏈表和樹等,
3.可以在定義的時候初始化,跟變數一樣,
詳見:https://www.runoob.com/cprogramming/c-structures.html
b. 結構訪問還有使用:
為了訪問結構的成員,我們使用成員訪問運算子(.),成員訪問運算子是結構變數名稱和我們要訪問的結構成員之間的一個句號,您可以使用 struct 關鍵字來定義結構型別的變數,
比如 你要訪問 Book1 的title --- Book1.title (如果學過面對物件編程的朋友估計感覺很眼熟)
c.結構作為函式引數:
您可以把結構作為函式引數,傳參方式與其他型別的變數或指標類似,您可以使用上面實體中的方式來訪問結構變數:
void printBook( struct Books book ){
,,,
,,,
,,,
}
d.指向結構的指標:
struct Books *struct_pointer; 定義
struct_pointer = &Book1; 結構變數的地址
struct_pointer->title; 指向該結構的指標訪問結構的成員
e.位域:
有些資訊在存盤時,并不需要占用一個完整的位元組,而只需占幾個或一個二進制位,例如在存放一個開關量時,只有 0 和 1 兩種狀態,用 1 位二進位即可,為了節省存盤空間,并使處理簡便,C 語言又提供了一種資料結構,稱為"位域"或"位段",
所謂"位域"是把一個位元組中的二進位劃分為幾個不同的區域,并說明每個區域的位數,每個域有一個域名,允許在程式中按域名進行操作,這樣就可以把幾個不同的物件用一個位元組的二進制位域來表示,
位域和結構體的定義基本上差不多,只不過需要多加 位域長度 ,
struct bs{
int a:8;
int b:2;
int c:6;
}data;
說明 data 為 bs 變數,共占兩個位元組,其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6 位,
使用時這兩種都可以:1. data.a 2. data->a
sub:
1.一個位域存盤在同一個位元組中,如一個位元組所剩空間不夠存放另一位域時,則會從下一單元起存放該位域,也可以有意使某位域從下一單元開始,
2.由于位域不允許跨兩個位元組,因此位域的長度不能大于一個位元組的長度,也就是說不能超過8位二進位,如果最大長度大于計算機的整數字長,一些編譯器可能會允許域的記憶體重疊,另外一些編譯器可能會把大于一個域的部分存盤在下一個字中,
3.位域可以是無名位域,這時它只用來作填充或調整位置,無名的位域是不能使用的.
4.位域在本質上就是一種結構型別,不過其成員是按二進位分配的,
5.結構體變數的首地址能夠被其最寬基本型別成員的大小所整除,
6.結構體每個成員相對于結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding),即結構體成員的末地址減去結構體首地址(第一個結構體成員的首地址)得到的偏移量都要是對應成員大小的整數倍,
參考:https://www.runoob.com/cprogramming/c-structures.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63332.html
標籤:C
上一篇:strcat函式(字串連接函式)
