天天看點

C語言雜談:指針與數組 (下)

原文出處:  川山甲   歡迎分享原創到 伯樂頭條

思維導圖

C語言雜談:指針與數組 (下)

介紹

前接上文C 雜談之 指針與數組 (一),接續往下談指針和數組。

指針與數組 ——承接上文進行擴充

你知道X = Y,在編譯運作過程中,是什麼樣嗎?

C語言雜談:指針與數組 (下)

字元指針與函數

1> 字元串是一個以”結尾的字元數組。

看一個例子:printf接受的是一個指向字元數組第一個字元的指針。

C語言雜談:指針與數組 (下)

這個例子與下面兩個代碼是一個道理.

C語言雜談:指針與數組 (下)
C語言雜談:指針與數組 (下)

2> 幾個常用字元函數的編寫。

1>>> strcat(s,t)函數,把t指向的字元複制到s指向的字元後面?——注意”

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

#include <stdio.h>

#include <assert.h>

void

*

strcat

(

char

*ps,

char

*t){

char

*addr = ps;

assert

((ps != NULL) && (t != NULL));

while

(*ps){ 

ps++;

}

while

(*ps++ = *t++){

}

return

addr;

}

int

main(){

char

s[5] = 

"AB"

;

char

*t =

"E"

;

printf

(

"%s\n"

,

strcat

(s, t));

return

0;

}

注意:在strcat裡的兩個指針ps和t,方法結束後,這兩個函數都指向”後面,因為ps++操作是”先取結果,後自增”

記憶體變化:

C語言雜談:指針與數組 (下)

2>>> 函數strend(s,t):字元串t出現在字元串s的尾部,傳回1,否則傳回0。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

strend

int

strlen

(

char

*p){

int

iLen = 0;

while

(*p){

iLen++;

p++;

}  

return

iLen;

}

int

strend(

char

*s,

char

*t){

int

sLen =

strlen

(s);

int

tLen =

strlen

(t);

if

(tLen > sLen)

return

0;

while

(*s)

s++;

while

(*t)

t++;

for

(;tLen--;){

if

(*--t != *--s)

return

0;

}  

return

1;

}

int

main(){

char

*s =

"Hell Wold , Chuanshanjia"

;

char

*t =

"Chuanshanjia"

;

printf

(

"%d\n"

, strend(s, t));

return

0;

}

3>>> strncpy(s,t,n) 将t中前n個字元複制到s中。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

strncpy

(s,t,n)

#include <stdio.h>

int

strlen

(

char

*p){

int

i = 0;

while

(*p){

p++;

i++;

}  

return

i;

}

char

*

strncpy

(

char

*s,

char

*t,

int

n){

char

*addr = s;

if

(!

strlen

(s) || !n)

return

0;

int

tLen =

strlen

(t);

if

(!tLen)

return

0;

if

(tLen < n)

n = tLen;

// Move the pointer s to the last

while

(*++s) ;

while

(n--){

*s++ = *t++;

}  

return

addr;

}

int

main(){

char

s[20] =

"Hell World "

;

char

*t =

"Chuanshanjia"

;

printf

(

"%s\n"

,

strncpy

(s, t, 2222));

return

0;

}

指令行參數

1.第一個參數(常用argc表示)(:運作時指令行參數數目;第二個參數(常用argv表示)是一個指向字元串數組的指針。

2.C語言規定,argv[0],表示啟動程式的名稱。

3.執行個體

C語言雜談:指針與數組 (下)

運作結果:

C語言雜談:指針與數組 (下)

記憶體配置設定:

C語言雜談:指針與數組 (下)

解釋:

>> argv是一個指向指針數組的指針。

是以接受參數也可以寫成:

C語言雜談:指針與數組 (下)

結合上圖,我們可以這樣了解:從裡向外看

C語言雜談:指針與數組 (下)

複雜聲明

1.閱讀——從右向左規則。

>> 規則符号:

———————————————————–

* 讀作”指向…的指針”

[] 讀作”…的數組”

() 讀作”傳回…的函數”

———————————————————–

下面兩個示例:

int *f() ; // f: 傳回指向int型的指針

>>步驟:

1)找辨別符f:讀作”f是…”

2)向右看,發現”()”讀作”f是傳回…的函數”

3)向右看沒有什麼,向左看,發現*,讀作”f是傳回指向…的指針的函數”

4)繼續向左看,發現int,讀作”f是傳回指向int型的指針的函數”

int (*pf)(); // pf是一個指針——指向傳回值為int型的函數

1)辨別符pf,讀作“pf是…”

2)向右看,發現),向左看,發現*,讀作 “pf是指向…的指針”

3)向右看,發現”()”,讀作“pf是指向傳回…的函數的指針”

4)向右看,沒有,向左看發現int,讀作”pf是指向傳回int型的函數的指針”

總結

我最近着重看C,是因為我想深入了解一下PHP核心語言和伺服器子產品開發。現在的C語言,能夠讓我更深入的了解計算機内部。

繼續閱讀