標籤:數組 指標 struct 元素 nbsp 平台 元組 內建類型 文法
基礎知識
(1)指標數組:int *a[10]
理解:a和[]先結合,構成數組a[10](同時說明這變數的本質是數組,所以最終應該叫做**數組),緊接著與*號結合說明這個數組中10個元素都是指標,且指向的是int型變數。因此他是一個指標數組。
(2)數組指標:int (*a)[10]
理解:a首先和*號結合表明變數a是一個指標變數(本質就是個指標,所以最終應該叫**指標),緊接著和[]結合,表明這個指標變數指向一個數組,這個數組由10個int類型元素構成。所以名稱為數組指標。
(3)函數指標
譬如函數為 void func(void);那麼函數指標為void (*p)(void); 指標變數p 變數p的類型為void (*)(void); 調用方式為*p
typedef與結構體
(1)結構體在使用時都是先定義結構體類型,再用結構體類型去定義變數。
(2)C語言文法規定,結構體類型使用時必須是struct 結構體類型名 結構體變數名;這樣的方式來定義變數。
(3)使用typedef一次定義2個類型,分別是結構體變數類型,和結構體變數指標類型。
typedef struct teacher
{
char name[20];
int age;
int mager;
}teacher, *pTeacher;
typedef與const
(1)typedef int *PINT;const PINT p2; 相當於是int *const p2;
(2)typedef int *PINT;PINT const p2; 相當於是int *const p2;
(3)如果確實想得到const int *p;這種效果,只能typedef const int *CPINT; CPINT p1;
使用typedef的重要意義(2個:簡化類型、創造平台無關類型)
(1)簡化類型的描述。
char *(*)(char *, char *);typedef char *(*pFunc)(char *, char *);
(2)很多編程體系下,人們傾向於不使用int、double等C語言內建類型,因為這些類型本身和平台是相關的(譬如int在16位機器上是16位的,在32位機器上就是32位的)。為瞭解決這個問題,很多程式使用自訂的中間類型來做緩衝。譬如linux核心中大量使用了這種技術.
核心中先定義:typedef int size_t; 然後在特定的編碼需要下用size_t來替代int(譬如可能還有typedef int len_t)
(3)STM32的庫中全部使用了自訂類型,譬如typedef volatile unsigned int vu32;
二重指標
二重指標用來指向一重指標。
二維數組的記憶體映像
(1)一維數組在記憶體中是連續分布的多個記憶體單元組成的,而二維數組在記憶體中也是連續分布的多個記憶體單元組成的。
(1)從記憶體角度來看,一維數組和二維數組沒有本質差別。
(2)二維數組int a[2][5]和一維數組int b[10]其實沒有任何本質差別。我們可以把兩者的同一單元的對應關係寫下來。
a[0][0] a[0][1] a[0][4] a[1][0] a[1][1] a[1][4]
b[0] b[1] b[4] b[5] b[6] b[9]
C語言複雜運算式與指標應用