《C專家程式設計》Finux you讀書筆記(2)

2022-07-30 19:00:21 字數 2760 閱讀 6219

p..《關於陣列和指標》

1.先看乙個程式,你認為如果編譯它,**會有錯誤?

1

#include

<

stdio.h

>

2#include

<

conio.h

>

3chara[2

][2] =

,};

4void

fuc_1(

char

**a) 5

8void

fuc_2(

char(*

a)) 9

12void

fuc_3(

char

a)13

16void

fuc_4(

char(*

a)[2

]) 17

20int

main(

void

) 21

好吧,其實注釋部分就說明了**有錯。下面是解釋:

(1)p255《小啟發》:

「陣列名被改寫成乙個指標引數」的規則並不是遞迴的。陣列的陣列會被改寫為「陣列的指標」,而不是指標的指標。

實參:char c[2][3];  所匹配的形參:char(*)[3];

實參:char *c[3];    所匹配的形參:char **c;

實參:char (*c)[3];    所匹配的形參:char (*c)[3];

(2)p227《軟體信條》:

在c語言中,沒有辦法向函式傳遞乙個普通的多維陣列。

這是因為我們需要知道每一維的長度,以便為位址運算提供正確的單位長度。

必須提供除了最左邊一維以外的所有維的長度。比如

fuc(int a[3][5]);

用下面的方法呼叫都可以:

int b[10][3][5]; fuc(b);

int b[999][3][5]; fuc(b);

但下面的無法通過編譯:

int b[10][5][5];fuc(b);

2.一些注意事項:

(1)p83陣列名是個左值,但是不可修改。

(2)p84陣列名並不是乙個指標,而是乙個資料名。所以,在宣告陣列時不可宣告乙個指標。

(3)p87只有字串常量才能在定義時進行如下初始化:

而其他型別常量不能這樣做如:

float *pip = 3.14; /*錯誤,不能通過編譯*/

(4)p87初始化指標時所建立的字串常量定義為唯讀。而字串常量初始化的陣列是可以修改的。

3.p201什麼時候陣列和指標是相同的(c標準):

(1)表示式中的陣列名,被編譯器當做乙個指向該陣列第乙個元素的指標。

(2)下標總是與指標的偏移量相同。

(3)在函式引數的宣告中,陣列名,被編譯器當做乙個指向該陣列第乙個元素的指標。

對陣列的引用如a[i]在編譯時總是被編譯器改寫成*(a+i)的形式。而且下標值的步長被調整到陣列元素的大小。

在處理一維陣列時,指標並不見得比陣列快。c語言把陣列下標改寫成指標偏移量的根本原因是這種方式是底層硬體使用的基本模型。

4.p207沒有辦法把乙個陣列本身傳給某個函式,因為它總是被轉化為乙個指向該陣列的指標。所以在此函式內部使用sizeof取得陣列大小時,得到的實際上是指標的大小。

有一樣操作只能在指標中進行,那就是修改陣列本身的值。因為陣列名是乙個不可修改的左值。如下:

int array[100],array2[100];

main()

fun1(int *ptr)

fun1(int arr)

5.p207程式設計挑戰:

(1)定義乙個函式,接受乙個字元陣列引數ca。在函式內部列印出&ca,&(ca[0])和&(ca[1])的值。

(2)定義另外乙個函式,接受乙個字元指標引數pa。在函式內部列印出&pa,&(pa[0]),&(pa[1]),++pa的值。

(3)建立乙個全域性字元陣列ga並用英文本母初始化。呼叫兩個使他作為引數的函式,比較兩個函式列印的值。

(4)在main函式中列印出&ga,&(ga[0]),&ga[1]的值。

(5)解釋其中原因。

1

#include

<

stdio.h

>

2#include

<

conio.h

>

3char

ga[32] =

;4void

fun1(

char

ca)5

11void

fun2(

char

*pa)

1219

intmain(

void)20

列印出:

&ga = 0x402000

&(ga[0]) = 0x402000

&(ga[1]) = 0x402001

&ca = 0x23ff50

&(ca[0]) = 0x402000

&(ca[1]) = 0x402001

&pa = 0x23ff50

&(pa[0]) = 0x402000

&(pa[1]) = 0x402001

++pa = 0x402001

《C專家程式設計》讀書記錄

第1章 c 穿越時空的迷霧 原型 把形參的型別作為函式宣告的一部分。這樣不僅函式名和返回型別已知,所有形參型別也已知。不可移植的 由編譯器設計者決定採取何種行動 即不同編譯器所採取的行為可能不相同,但都是正確的 未確定的 附 乙個程式有可能在乙個特定的編譯器裡是遵循標準的,但在另乙個編譯器裡卻是不遵...

《C 專家程式設計》讀書筆記

前言 程式設計挑戰 計算機日期 第二章 這不是bug,而是語言特徵 switch的乙個bug break中斷了什麼 第三章 分析c語言宣告 程式設計挑戰 把c 語言的宣告翻譯成通俗的語言 include include include include define max len 100 enum ...

《C專家程式設計》讀書筆記

第一章 const float 表示乙個指向float型別常量的指標 第二章 1.在c語言中const並非真正表示 常量 在陣列定義與case中不可以使用 2.case的一些問題 2 3 main 15 這段 列印出來的是 3.函式可見性 void sb any where 2 extern voi...