C語言的零碎 (三)

main函數的標準原型應該是int main(int argc, char *argv[]);argc是命令行參數的個數。而argv是一個指向指針的指針,爲什麼不是指針數組呢?因爲前面講過,函數原型中的[]表示指針而不表示數組,等價於char **argv。那爲什麼要寫成char *argv[]而不寫成char **argv呢?這樣寫給讀代碼的人提供了有用信息,argv不是指向單個指針,而是指向一個指針數組的首元素。數組中每個元素都是char *指針,指向一個命令行參數字符串。

 指向非const變量的指針或者非const變量的地址可以傳給指向const變量的指針,編譯器可以做隱式類型轉換,例如
      char c = 'a'; 
      const char *pc = &c;
但是,指向const變量的指針或者const變量的地址不可以傳給指向非const變量的指針,以免透過後者意外改寫了前者所指向的內存單元,例如對下面的代碼編譯器會報警告:
    const char c = 'a';
    char *pc = &c;

const int *a;
int const *a;
這兩種寫法是一樣的,a是一個指向const int型的指針,a所指向的內存單元不可改寫,所以(*a)++是不允許的,但a可以改寫,所以a++是允許的。
int * const a;
a是一個指向int型的const指針,*a是可以改寫的,但a不允許改寫。

int *a[10] -指針數組與int (*a) [10]-指向數組的指針
我們可以認爲[]比*有更高的優先級,如果a先和*結合則表示a是一個指針,如果a先和[]結合則表示a是一個數組。
int *a[10];這個定義可以拆成兩句:
typedef int *t;
t a[10];
t代表int *類型,a則是由這種類型的元素組成的數組。

int (*a)[10];這個定義也可以拆成兩句:
typedef int t[10];
t *a;
t代表由10個int組成的數組類型,a則是指向這種類型的指針。

int a[10];
int (*pa)[10] = &a;

a是一個數組,在&a這個表達式中,數組名做左值,取整個數組的首地址賦給指針pa。
注意,&a[0]表示數組a的首元素的首地址,而&a表示數組a的首地址,顯然這兩個地址的數值相同,但這兩個表達式的類型是兩種不同的指針類型,前者的類型是int *,而後者的類型是int (*)[10]。*pa就表示pa所指向的數組a,所以取數組的a[0]元素可以用表達式(*pa)[0]。注意到*pa可以寫成pa[0],所以(*pa)[0]這個表達式也可以改寫成pa[0][0],pa就像一個二維數組的名字,它表示什麼含義呢?下面把pa和二維數組放在一起做個分析。
int a[5][10];和int (*pa)[10];之間的關係同樣類似於int a[10];和int *pa;之間的關係:a是由一種元素組成的數組,pa則是指向這種元素的指針。所以,如果pa指向a的首元素:
int a[5][10];
int (*pa)[10] = &a[0];
則pa[0]和a[0]取的是同一個元素,唯一比原來複雜的地方在於這個元素是由10個int組成的數組,而不是基本類型。這樣,我們可以把pa當成二維數組名來使用,pa[1][2]和a[1][2]取的也是同一個元素,而且pa比a用起來更靈活,數組名不支持賦值、自增等運算,而指針可以支持,pa++使pa跳過二維數組的一行(40個字節),指向a[1]的首地址。 

void (*f)(const char *) = say_hello;
void (*f)(const char *) = &say_hello;
say_hello是一種函數類型,而函數類型和數組類型類似,做右值使用時自動轉換成函數指針類型,所以可以直接賦給f.
把函數say_hello先取地址再賦給f,就不需要自動類型轉換了

exec系統調用執行新程序時會把命令行參數和環境變量表傳遞給main函數
父進程在創建子進程時會複製一份環境變量給子進程,但此後二者的環境變量互不影響。
fork函數的特點概括起來就是“調用一次,返回兩次”,在父進程中調用一次,在父進程和子進程中各返回一次。
子進程中fork的返回值是0,而父進程中fork的返回值則是子進程的id(從根本上說fork是從內核返回的,內核自有辦法讓父進程和子進程返回不同的值)

任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數據必須通過內核,在內核中開闢一塊緩衝區,進程1把數據從用戶空間拷到內核緩衝區,進程2再從內核緩衝區把數據讀走,內核提供的這種機制稱爲進程間通信 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章