讀書筆記 C和指標 陣列(未完)

2021-08-16 06:09:56 字數 1619 閱讀 7886

陣列名:

陣列名的值是乙個指標常量:

陣列具有確定數量的元素,而指標只是乙個標量值。

編譯器用陣列名來記住這些屬性。只有當陣列名在表示式中使用時,編譯器才會為他產生乙個指標常量(這裡是指標常量而不是指標變數,不能修改常量的值)。

因為指標常量所指向的是記憶體中陣列的起始位置,如果修改這個指標常量,唯一可行的操作就是把整個陣列移動到記憶體的其他位置。但是,在程式完成鏈結之後,記憶體中陣列的位置是固定的,所以當程式執行時,再想移動陣列就晚了。因此,陣列名的值是乙個指標常量。

當陣列名作為sizeof操作符或單目操作符&的運算元時,陣列名不用指標常量來表示的兩種場景

sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。

取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是指向某個指標常量值的指標。

下標引用:

arr[i] 與 *(arr + ( i ) )的意義是相同的,即除了優先順序之外,下標引用和間接訪問完全相同。

2[arr]

*(2 + (arr))

arr[2]

這三個式子其實是一樣的。第乙個式子之所以合法與源於c實現下標的方法,但是不建議這麼寫,因為會大大影響程式的可讀性。

指標的效率

【結論】

陣列和指標

首先陣列和指標都具有指標值,他們都可以進行間接訪問和下標引用操作,但是他們之間還存在乙個特別大的區別。

宣告陣列時,編譯器會根據宣告所指定的元素數量為陣列保留記憶體空間,然後再建立陣列名,它的值是乙個常量,指向這段空間的起始位置;

宣告乙個指標變數時,編譯器只為指標本身保留記憶體空間,並且指標變數並未被初始化為指向任何現有的記憶體空間。

作為函式引數的陣列名

陣列名作為引數傳遞給乙個函式 ,其實傳遞給函式的是乙份該指標(指向陣列的起始位址)的臨時拷貝 。函式如果執行了下標引用,實際上是對這個指標執行間接訪問操作,函式就可以訪問和修改呼叫程式的陣列元素。

傳址呼叫是通過傳遞乙個指向所需元素的指標,然後再函式中對該指標執行間接訪問操作實現對資料的訪問。作為引數的陣列名是個指標,下表引用實際執行的就是間接訪問。

而陣列的傳值呼叫則體現在,陣列傳遞給函式的是引數的乙份拷貝(指向陣列起始位置的指標的拷貝),所以函式可以自由的操作它的指標形參,而不必擔心會修改對應的作為實參的指標。

即這個引數(指標)實際上是通過傳值方式傳遞的,函式得到的是該指標的乙份拷貝,它可以被修改,但呼叫程式所傳遞的實參並不受影響。

宣告陣列引數

int test(char* arr);

int test(char arr);

呼叫函式時實際傳遞的是乙個指標,所以函式的形參實際是個指標。但是同時它也接收陣列形式的函式形參。所以以上兩種寫法都是可以的。

那麼,函式原型中的一維陣列形參為什麼無需寫明它的元素數目?

因為函式並不為陣列引數分配記憶體空間。形參只是乙個指標,它指向的是已經在其他地方分配好記憶體的空間。這也解釋了為什麼陣列形參可以與任何長度的陣列匹配—-它實際傳遞的只是指向陣列第1個元素的指標。另一方面,這種實現方法使函式無法知道陣列的長度。所以如果函式需要知道陣列的長度,它必須作為乙個顯示的引數傳遞給函式。

初始化

C和C指標讀書筆記

1.c中變數的儲存型別 儲存型別分為靜態儲存 普通記憶體 堆疊,暫存器自動變數即 塊內部的變數儲存於堆疊,其他變數儲存於普通記憶體即靜態儲存,如果頻繁訪問乙個變數,宣告為暫存器型別後儲存於硬體暫存器中。2.c中實體的鏈結屬性 1 屬於internal鏈結屬性的識別符號在同乙個原始檔內的所有宣告中都指...

《C和指標》讀書筆記 6

宣告 該讀書筆記摘抄自 c和指標 kenneth a.reek 著 徐波 譯 為了克服自己走馬觀花,提高閱讀和學習效率,決定將自己在讀書過程中遇到的一些知識點加以摘抄和總結備忘,在此感謝原書作者和翻譯。一 遞迴的兩個特性 1 存在限制條件 2 每次遞迴之後越來越接近限制條件 二 將二進位制數字轉換為...

《C和指標》讀書筆記 7

宣告 該讀書筆記摘抄自 c和指標 kenneth a.reek 著 徐波 譯 為了克服自己走馬觀花,提高閱讀和學習效率,決定將自己在讀書過程中遇到的一些知識點加以摘抄和總結備忘,在此感謝原書作者和翻譯。一 陣列名 1 乙個誤區 陣列名並不表示整個陣列,它大多時候只是乙個指標常量,指向陣列的第乙個元素...