C語言復雜表達式與指針應用
基礎知識
(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語言復雜表達式與指針應用