C語言_通過指針引用字符串_第1頁
C語言_通過指針引用字符串_第2頁
C語言_通過指針引用字符串_第3頁
C語言_通過指針引用字符串_第4頁
C語言_通過指針引用字符串_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、C語言_通過指針引用字符串2021-7-121 上一節(jié)我們學(xué)到了上一節(jié)我們學(xué)到了 n指針與二維數(shù)組指針與二維數(shù)組 nai*(a+i) naij*(*(a+i)+j) na、a+i、*(a+i)、ai、*(*(a+i)+j)等怎么理解等怎么理解 n行指針與列指針行指針與列指針 n如何定義一個指向二維數(shù)組的指針如何定義一個指向二維數(shù)組的指針 n行指針:行指針:指向一維子數(shù)組,指向一維子數(shù)組,int (*p)10; n列指針:指向元素,列指針:指向元素,int *p; n如何向函數(shù)傳遞一個指向二維數(shù)組的指針如何向函數(shù)傳遞一個指向二維數(shù)組的指針 C語言_通過指針引用字符串2021-7-122 第第8章

2、章 善于利用指針善于利用指針 n8.1 指針是什么指針是什么 n8.2 指針變量指針變量 n8.3 通過指針引用數(shù)組通過指針引用數(shù)組 n8.4 通過指針引用字符串通過指針引用字符串 n8.5 指向函數(shù)的指針指向函數(shù)的指針 n8.6 返回指針值的函數(shù)返回指針值的函數(shù) n8.7 指針數(shù)組和多重指針指針數(shù)組和多重指針 n8.8 動態(tài)內(nèi)存分配與指向它的指針變量動態(tài)內(nèi)存分配與指向它的指針變量 n8.9 有關(guān)指針的小結(jié)有關(guān)指針的小結(jié) C語言_通過指針引用字符串 n字符指針字符串(字符指針字符串(char *string) n字符串常量字符串常量 nstrcpy源碼源碼 2021-7-123 C語言_通過指

3、針引用字符串2021-7-124 回憶字符串回憶字符串 n一串以一串以0結(jié)尾的字符在結(jié)尾的字符在C語言中被看作字符串語言中被看作字符串 n字符串常量是用雙引號括起的字符串常量是用雙引號括起的以以0結(jié)束結(jié)束的一的一 串字符。串字符。 n在程序開始運行時分配在全局數(shù)據(jù)區(qū)的文字常在程序開始運行時分配在全局數(shù)據(jù)區(qū)的文字常 量區(qū),存儲在無名數(shù)組中。量區(qū),存儲在無名數(shù)組中。 n相同字符串常量只有一個副本。相同字符串常量只有一個副本。 nC語言語言表示字符串的兩種表示法表示字符串的兩種表示法 n字符數(shù)組字符數(shù)組 n字符指針字符指針 C語言_通過指針引用字符串2021-7-125 代碼區(qū)(代碼區(qū)(code a

4、rea) 操作系統(tǒng)內(nèi)核區(qū)操作系統(tǒng)內(nèi)核區(qū) 全局數(shù)據(jù)區(qū)全局數(shù)據(jù)區(qū) 堆區(qū)堆區(qū)heap 棧區(qū)棧區(qū)stack 文字常量區(qū)文字常量區(qū) 未初始化靜態(tài)變量區(qū)未初始化靜態(tài)變量區(qū) 已初始化靜態(tài)變量區(qū)已初始化靜態(tài)變量區(qū) 低址低址 數(shù)數(shù) 據(jù)據(jù) 區(qū)區(qū) 字符串常量 沒有初始化的全局變量和靜態(tài)變量 初始化的全局變量和靜態(tài)變量 malloc() free() 局部變量 函數(shù)的二進制碼 內(nèi)存分配內(nèi)存分配 C語言_通過指針引用字符串2021-7-126 char string 例例 n例例8.16 int main() char string = I love China!; printf(%cn, string7); prin

5、tf(%sn, string); 運行時輸出:運行時輸出: C I love China! C語言_通過指針引用字符串2021-7-127 char* string 例例 n例例8.17 int main() char *string = I love China!; printf(%sn, string); n把存放字符串的無名數(shù)組的首地址賦給把存放字符串的無名數(shù)組的首地址賦給string。 nchar *string = I love China!; 等價于:等價于: char *string; string = I love China!; C語言_通過指針引用字符串2021-7-128

6、 練習(xí)練習(xí) n下面各語句中,能正確進行字符串賦值操作的語句是下面各語句中,能正確進行字符串賦值操作的語句是 ( ) char s5 =ABCDE; char s5 =A,B,C,D,E; char *s;s=ABCDE; char *s;scanf(%s, s); char s8; s = ABCDE; nQ: printf(%sn, abc+1); n輸出:輸出:bc C語言_通過指針引用字符串2021-7-129 n例例8.20 用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制。用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制。 (1) 用字符數(shù)組作參數(shù)。用字符數(shù)組作參數(shù)。 C語言_通過指針引用字符串2021-7-1210 strc

7、py函數(shù)函數(shù) /* Copies the string src into the spot specified by dest; assumes enough room. 目標指針空間必須大于源字符串空間。目標指針空間必須大于源字符串空間。 在調(diào)用前請確認目標指針空間是否大于源字符串的空間。在調(diào)用前請確認目標指針空間是否大于源字符串的空間。 */ void MyStrcpy(char dstStr, char srcStr) int i = 0; while (dstStri = srcStri) != 0) +i; C語言_通過指針引用字符串2021-7-1211 int main() ch

8、ar a16 = good good study; char b16 = day day up; char c30; MyStrcpy(b, a); MyStrcpy(c, “copy successfully”); printf(string a:%snstring b:%sn%sn, a, b, c); return 0; C語言_通過指針引用字符串2021-7-1212 n在在main函數(shù)中也可以用字符型指針變量作實參。函數(shù)中也可以用字符型指針變量作實參。 int main() char a16 = good good study; char b16 = day day up; char

9、 *pa = a, *pb = b; printf(string a:%snstring b:%snn, pa, pb); MyStrcpy(pb, pa); printf(copy string a to string bnn); printf(string a:%snstring b:%sn, pa, pb); C語言_通過指針引用字符串2021-7-1213 字符指針做字符指針做形參形參 void MyStrcpy(char *dst, char *src) while (*dst=*src)!= 0) +dst; +src; C語言_通過指針引用字符串2021-7-1214 n進一步簡

10、化進一步簡化 while (*dst+ = *src+);不推薦不推薦 等價于等價于 while (*dst+ = *src+)!= 0); 推薦推薦 n函數(shù)體中函數(shù)體中while語句也可以改用語句也可以改用for語句:語句: for (;(*dst=*src)!=0;+dst,+src); 推薦推薦 等價于等價于 for (;*dst+=*src+;);不推薦不推薦 C語言_通過指針引用字符串2021-7-1215 n以上各種用法以上各種用法, 變化多端變化多端, 使用十分靈活使用十分靈活, 初看起來初看起來 不太習(xí)慣不太習(xí)慣, 含義不直觀。初學(xué)者會有些困難含義不直觀。初學(xué)者會有些困難, 也

11、容也容 易出錯。但對易出錯。但對C熟練之后熟練之后, 以上形式的使用是比較以上形式的使用是比較 多的多的, 讀者應(yīng)看懂讀者應(yīng)看懂并逐漸熟悉它并逐漸熟悉它,。 n軟件簡單為美(軟件簡單為美(Keep It Simple Software,KISS):): 正確優(yōu)于速度。簡單優(yōu)于復(fù)雜。清晰優(yōu)于機巧。正確優(yōu)于速度。簡單優(yōu)于復(fù)雜。清晰優(yōu)于機巧。 C語言_通過指針引用字符串2021-7-1216 出現(xiàn)頻率最高的筆試題出現(xiàn)頻率最高的筆試題 n題目:題目: 已知已知strcpy函數(shù)的原型是:函數(shù)的原型是: char * strcpy(char * dest,const char * src); 1.不調(diào)用庫

12、函數(shù),實現(xiàn)不調(diào)用庫函數(shù),實現(xiàn)strcpy函數(shù)。函數(shù)。 2.解釋為什么要返回解釋為什么要返回char *。 nchar *strcpy(char *dest,const char *src) char *destsave = dest; /1 assert(dest);/2 assert(src);/3 while (*dest+=*src+)!=0); /4 return destsave; C語言_通過指針引用字符串2021-7-1217 錯誤的做法錯誤的做法 n1 忘記保存原始的忘記保存原始的dest值,說明答題者邏輯思維不嚴值,說明答題者邏輯思維不嚴 密。密。mystrcpy執(zhí)行到最后一

13、行時執(zhí)行到最后一行時dest已指向已指向0后面的后面的 位置位置 n2 利用斷言檢查指針的有效性,如不檢查,說明答題利用斷言檢查指針的有效性,如不檢查,說明答題 者不注重代碼的健壯性。者不注重代碼的健壯性。 n2、解釋為什么要返回、解釋為什么要返回char * n實現(xiàn)鏈式表達式實現(xiàn)鏈式表達式 char c20; char *pc = c; mystrcpy(pc, mystrcpy(pb, pa); C語言_通過指針引用字符串2021-7-1218 strlen /*函數(shù)功能:函數(shù)功能: 計算字符串的長度計算字符串的長度 函數(shù)參數(shù):函數(shù)參數(shù): 字符型指針變量字符型指針變量pStr,指向字符串,

14、指向字符串 函數(shù)返回值:字符串的長度函數(shù)返回值:字符串的長度 */ unsigned int MyStrlen(char *pStr) unsigned int len = 0; for (; *pStr!=0; pStr+) len+; return len; C語言_通過指針引用字符串2021-7-1219 FreeBSD的的strlen源碼源碼 / FreeBSD的的strlen源碼源碼 size_t strlen(const char *str) const char *s; for (s = str; *s; +s); return (s - str); C語言_通過指針引用字符串2

15、021-7-1220 “char array” vs “char pointer” n 賦值方式不同賦值方式不同 n 輸入方式不同輸入方式不同 n 字符指針是變量,而字符數(shù)組名是常量字符指針是變量,而字符數(shù)組名是常量 n 指針指向格式字符串指針指向格式字符串 C語言_通過指針引用字符串2021-7-1221 (1) 賦值方式賦值方式 n對字符指針變量賦值對字符指針變量賦值 char *a=I love China!; 等價于等價于 char *a; a=I love China!; 但注意賦給但注意賦給a的不是字符的不是字符, 而是字符串的首地址。而是字符串的首地址。 n而對數(shù)組的初始化:而對

16、數(shù)組的初始化: char str14 = I love China!;不能等價于不能等價于 char str14; str = I love China!; 應(yīng)為:應(yīng)為:strcpy(str, I love China!); C語言_通過指針引用字符串2021-7-1222 char str10; scanf(%s, str); 是可以的是可以的 n而而 char *p; scanf(%s, p); 是危險的。是危險的。 n應(yīng)當這樣:應(yīng)當這樣: char *p, str10; p = str; scanf(%s, p); 先使先使p指向一個字符數(shù)組指向一個字符數(shù)組, 把輸入的字符串存放在以該地

17、址開把輸入的字符串存放在以該地址開 始的數(shù)組中。始的數(shù)組中。 (2) 輸入方式輸入方式 C語言_通過指針引用字符串2021-7-1223 (3) 指針變量的值是可以改變的指針變量的值是可以改變的 char *p = I love China!; p = p + 7; printf(%s, p); n運行結(jié)果如下:運行結(jié)果如下: China! n輸出字符串時從輸出字符串時從p當時所指向的單元開始輸出各個字符當時所指向的單元開始輸出各個字符, 直直 到遇到遇0為止。為止。 n而數(shù)組名的值是不能改變的。下面是錯誤的:而數(shù)組名的值是不能改變的。下面是錯誤的: char str=I loveChina!

18、; str = str + 7; printf(%s, str); (3) 字符指針是變量,而字符數(shù)組名是常量字符指針是變量,而字符數(shù)組名是常量 C語言_通過指針引用字符串2021-7-1224 n可以用下標形式引用字符串中的字符。如:可以用下標形式引用字符串中的字符。如: int main() char *p=I love China!; int i; printf(The sixth character is %cn, p5); printf(“%sn”,p); C語言_通過指針引用字符串2021-7-1225 (4) 指針指向格式字符串指針指向格式字符串 char *format = a=%d, b=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論