1. 程式人生 > >C語言復雜表達式與指針應用

C語言復雜表達式與指針應用

平臺無關 變量類型 pin 同時 oid 復雜 數組 多個 定義

基礎知識

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