C程式語言讀書筆記 5

2021-05-26 15:12:04 字數 3766 閱讀 3953

double *dp, atof(char *);

表明,*dp

和atof(char *)

的值都是

double

型別的。該宣告中

atof

的引數是指向

char

型別的指標,指標必須指向特性型別的物件,但是

void

型別的指標可以存放指向任何型別的指標。

陣列和指標的關係:

陣列名所代表的指標就是該陣列最開始的乙個元素的位址。在計算陣列元素a[i]

的值時,

c語言實際上去先將其轉換為

*(a + i)

的形式在進行計算的,因為

pa[i] 

和 *(pa + i)

是等價的。需要注意的是,

pa[i]

雖然在語法上是合法的,但是如果

(p + i)

不在陣列範圍內,則引用邊界之外的物件是非法的。一般而言,用指標編寫的程式比用陣列下標編寫的程式執行速度快。

#include int strlen(char *s)

main()

; char *ptr = "hello,world";

printf("%d\n", strlen("hello,world"));

printf("%d\n", strlen(arr));

printf("%d\n", strlen(ptr));

return 0;

}

以上**的三個printf的結果都是一樣的。

觀察這三種呼叫strlen

函式的方式,實際上他們在這裡都是等價的,都傳遞第乙個元素的位址。

字串常量是乙個字元陣列,所以字串常量可以通過乙個指向其第乙個元素的指標訪問。

有效的指標運算:

除了以上型別的運算,其他所有形式的指標都是非法的,例如兩個指標間的加法、乘法、除法、移位或遮蔽運算,指標同float

或double

型別之間的加法運算;不經強制型別轉換而直接將指向同一型別物件的指標賦值給指向另一種型別物件的指標的運算

(兩個指標之一是

void *

型別的情況除外)。

#include #define n 100

#define printval(val) printf(#val " = %d\n", val)

int pint[n];

double pdouble[n];

int main()

觀察以上程式的輸出可以發現,指標加上乙個整數,該整數會根據指標指向物件的長度按比例縮放。

由此,函式strlen()

可以寫成如下形式

:

int strlen(char *s)

現在我們看看陣列和指標的區別。

char amessage = "now is the time";/* 定義乙個陣列*/

char *pmessage = "now is the time"; /* 定義乙個指標*/

上面的定義有很大差別。

上面宣告中,amessage是乙個僅僅足以存放初始化字串以及空字元

'\0'

的一維陣列。陣列中的單個字串可以進行修改,但

amessage

始終指向同一儲存位置。另一方面,

pmessage

是乙個指標,其初值指向乙個字串常量,之後可以被修改以指向其他位址。但如果試圖修改字串的內容,結果是沒有定義的。

書中向我們展示了strcpy(s,t)

(把指標

t指向的字串複製到指向指標指向的位置)

4中不同的實現版本。這幾個簡短的程式不僅有助於理解指標,而且有益於我們學習

c風格的程式設計。

void strcpy(char *s, char *t)

void strcpy(char *s, char *t)

}void strcpy(char *s, char *t)

void strcpy(char *s, char *t)

當然,最後乙個版本的strcpy(s, t)

是最好的。它利用指標而且更進一步精煉程式。在

ascll

碼中,'\0'

的ascll

碼值是0

。如果在函式宣告中,除陣列的第一維(下標)可以不指定大小外,其餘各維都必須明確指定大小。

指標陣列:

先看看指標陣列是怎麼初始化的:

char *color = ;
觀察以上**,可以發現,指標陣列有乙個重要的優點:每一行長度可以不同。

再將指標陣列和二維陣列做個比較:

char *name = ;

char aname[15] = ;

name是乙個存放

char *

的陣列,陣列每個元素指向乙個字串。

而二維陣列是每一行存放乙個對應的字串。可以直接修改字串的值。

函式指標的宣告方法為:   

資料型別標誌符 (

指標變數名) (

形參列表); 

例如:   

int func(int x); /* 

宣告乙個函式 

*/ int (*f) (int x); /* 宣告乙個函式指標 

*/ f=func; /* 將

func

函式的首位址賦給指標

f */ 

賦值時函式func

不帶括號,也不帶引數,由於

func

代表函式的首位址,因此經過賦值以後,指標

f就指向函式

func(x)

的**的首位址。 

#include void swap(int v, int i, int j)

int main()

; void (*pswap)(int , int , int);

pswap = swap;

pswap(num, 0, 1);

printf("%d\n%d\n", num[0], num[1]);

return 0;

}

在c

語言中,指標的宣告可以很複雜。以下是書中對一些宣告的解釋:

char **argv;//argv: pointer to pointer to char

int (*daytab)[13]; //daytab: pointer to array[13] of int

int *daytab[13]; //daytab: array[13] of point to int

void *comp(); //comp: function returning pointer to void

void (*comp)(); //comp: pointer to function returning void

char (*(*x()))(); //x: function returning pointer to array of

//pointer to function returning char

char (*(*x[3])())[5];//x: array[3] of pointer to function returning

//pointer to array[5] of char

《c程式語言》讀書筆記

舉例如下 char a 10 1 定義的時候直接用字串賦值 char a 10 hello 注意 不能先定義再給它賦值,如 char a 10 a 10 hello 這樣是錯誤的!2 對陣列中字元逐個賦值 char a 10 3 利用strcpy char a 10 strcpy a,hello 易...

《C程式語言》 讀書筆記

在mac下可以使用sublime進行c語言程式編寫,然後通過命令列來執行c程式。在sublime新建乙個c程式,譬如 test.c include main 然後在命令列中執行 cc test.c編譯後會自動生成乙個a.out檔案,然後我們執行a.out檔案 test.c就會在命令行內列印出 hel...

C語言讀書筆記

1.c語言中一共有32個關鍵字 分別是 auto int double long char short float unsigned signed sizeof extern static goto if else struct typedef union enum switch case brea...