9 12學習記錄 C和指標》讀後感

2021-07-22 16:20:55 字數 1897 閱讀 1537

《c和指標》這本書是暑假看的,看的不算精吧,也可以說是原來懂得鞏固一下,之前沒有理解的這次還是沒有徹底弄明白。我就把我看的比較仔細地方做一點整理。

先講陣列這塊,我們先考慮下面這個例子:

int a[10];

int b[10];

int *c;

c = &a[0];

表示式&a[0]是乙個指向陣列第乙個元素的指標。但那正是陣列名本身的值,所以下面這條賦值語句和上面那條賦值語句所執行的任務是完全一樣的;

c = a;

這條賦值語句說明了為什麼理解表示式中的陣列名的真正含義是非常重要的。如果陣列名表示整個陣列,這條語句就表示整個陣列被複製到乙個新的陣列。但事實上完全不是這樣,實際被複製的是乙個指標的拷貝,c所指向的是陣列的第乙個元素。因此,像下面這樣的表示式:

b = a;是非法的。你不能把賦值符把乙個陣列的所有元素複製到另乙個陣列。你必須使用乙個迴圈,每次複製乙個元素。考慮下面這條語句

a = c;c被宣告為乙個指標變數,這條語句看上去像是執行某種形式的指標賦值,把c的值複製給a,但這個賦值是非法的:記住!在這個表示式中,a的值是個常量,不能被修改。

指標和下標:

如果你可以互換地使用指標表示式和下標表示式,那麼你應該先使用哪個呢?和往常一樣,並沒有乙個簡明的答案,但對於絕大多數人而言,下標更加容易理解。可讀性方面下標比較占有優勢,但在另乙個方面,指標可能效率會更高一些。

讓我們來研究兩個迴圈:

首先,我們使用下標方案將陣列中的所有元素都設定為:

int  array[10],a;

for(a = 0,a < 10, a+=1)

array[a] = 0;

為了對下標表示式求值,編譯器在程式中插入指令,取得a的值,並把它與整形的長度(也就是4)相乘,這個乘法需要花費一定的時間和空間。讓我們看一下另一種寫法:

int  array[10],*ap;

for(ap = array; ap < array+10; ap+=1 )

*ap =  0;

儘管這裡並不存在下標,但是存在乘法運算。這個例子說明了指標比下標更有效率的場合——當你在陣列中1次1步(或某個特定的數字)移動時,與固定數字相乘的運算在編譯時完成,所以在執行所需要的指令就少一些。在絕大多數機器上,程式將會更小一些,更快一些。

我們再看兩個**:

a = get_value();                   a = get_value();

array[a] = 0;                       *(array+a ) = 0;

兩邊的語句所產生的**沒有區別。這個例子說明了指標和下標的效率完全相同的場合。

陣列和指標

請考慮下面這兩個宣告:

int a[5];

int *b;

這兩句** ,它們都具有指標值,都可以進行間接訪問和下標引用操作。但是它們的差別還是很大的。表示式*a是完全合法的,但表示式*b是非法的,*b將訪問記憶體中某個不確定的位置,或者導致程式終止。另一方面,表示式b++可以通過編譯,但a++卻不行,因為a的值是個常量。

作為函式引數的陣列名:

所有的引數都是通過傳值方式傳遞的。當然,如果你傳遞乙個指向某個變數的指標,而函式對指標執行了間接訪問操作,那麼函式就可以修改那個變數。儘管看上去並不明顯,但陣列名作為引數時發生的都是這種情況。這個引數(指標)實際上通過傳值的方式傳遞的,函式得到的是該指標的乙份拷貝,它可以被修改,但呼叫程式的實參並不受影響

宣告陣列引數:

int strlen(char *string);

int strlen(char string);

現在你應該清楚為什麼函式原型中的一位陣列形參無需寫明他的元素數目,因為函式並不為陣列引數分配空間。形參只是乙個指標,它指向的是已經在其他地方分配好的記憶體。這個事實闡述了為什麼陣列形參可以與任何長度的陣列匹配——它實際傳遞的只是指向陣列第乙個元素的指標

《學習之道》讀後感

組塊建立 拖延症小惡魔 增強記憶力 組塊就是根據意義將資訊碎片集合,就像乙個個知識點如一塊塊拼圖塊組成拼圖,就像是把相關的檔案打包成zip。只要把乙個相關部分打包成乙個組塊,就不要糾結於所有的細節枝末節,可以快速行動起來。比如你作為乙個程式設計師,你寫乙個排序,你如果沒有排序的組塊,你還要一步步去推...

《C程式設計》讀後感

c程式設計 讀後感 網上很多人評價這書不高,其實從內心裡講,是這本書帶領我入門的。我說的是譚浩強先生的書。這本書講得很細,而且知識的銜接也做得很好。我以這本書為重點,再以其它的c語言教程為輔,終於算是入了c語言的門。如果能讓我再從頭學習的話,我一定是認真的讀這本教材,再把c的標準庫的原始碼作為閱讀材...

《學習的本質》讀後感

今天讀 學習的本質 附上該書的思維導圖。學習的本質書中講到2個概念和3個高效學習方 先有概念 根據已有的知識去建構新知識,在人的大腦裡,由於對已有行為編碼,決定現在的判斷決定。但也容易先入為主,形成錯誤的認知。所以要打破認知侷限,需要再進一步的帆板模式。帆板模式 持續不均衡狀態,人的學習知識的形成就...