C語言新教材PPT課堂課件-6-指針_第1頁
C語言新教材PPT課堂課件-6-指針_第2頁
C語言新教材PPT課堂課件-6-指針_第3頁
C語言新教材PPT課堂課件-6-指針_第4頁
C語言新教材PPT課堂課件-6-指針_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第六章 指針主要內(nèi)容:6.1 指針和指針變量6.2 數(shù)組與指針6.3 字符串與指針6.4 指針數(shù)組和指向指針的指針2i2000100 地址變量名變量值int i=100;假設(shè)為i分配地址為2000的存儲單元6.1 指針和指針變量6.1.1 指針的概念地址2000“指向”變量 i內(nèi)存用戶數(shù)據(jù)區(qū)變量 i100地址2000注意:變量的地址不同于變量名可用&i 獲取32000100ii_pointer指針變量:用來存放地址的變量。將地址2000存放在變量i_pointer中2000是“變量的地址”i_pointer稱為“指針變量”4指針的概念 兩種觀點:1、指針是指針變量的簡稱。 C語言之父丹尼斯里

2、奇:A pointer isa variable that contains the address of a variable. 2、指針是地址的形象化稱謂。 我國著名的C語言教材編寫者譚浩強:變量的地址稱為該變量的“指針”。5指針是C的精華,沒掌握指針就等于沒掌握C語言。指針的意義C程序設(shè)計中使用指針可以:有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動態(tài)分配內(nèi)存方便地使用數(shù)組和字符串得到多于一個的函數(shù)返回值使用指針,可以使程序更加簡潔、緊湊、高效6指針變量的定義: 類型名 *指針變量名;如:int *p ;定義 p 為指向整型(基類型為整型)的指針變量,即 p 中可以存放一個整型數(shù)據(jù)的地址。6.1.2 指針變

3、量的定義“*”表示所定義的變量為指針型變量定義指針所指向的數(shù)據(jù)類型,也叫“基類型名”71. 取地址運算符 & 用法:&變量名 功能:取變量的地址 單目運算符,“右”結(jié)合性,優(yōu)先級220003iC程序不關(guān)心變量的地址具體值,需要地址時,用 &i 取地址&i6.1.3 指針運算8四、訪問指針變量所指單元舉例:如果有定義 int a,b,*p; p=&a; *p=78; 等價于 a=78 ; b=*p+4; 等價于 b=a+4 ;2.間接訪問運算符 * 用法:*指針變量名 功能:對指針變量所指單元間接訪問,即引用指針變量所指單元的值 單目運算符,“右”結(jié)合性,優(yōu)先級2注意:定義指針變量時的“*”與其

4、它位置出現(xiàn)的“*”含義不同 前者表示p是指針變量 后者表示對指針變量所指單元進行間接訪問*p是對變量a的間接訪問a是對變量的直接訪問9目的:將指針變量指向一個存儲單元三、指針變量的賦值指向變量的指針變量的賦值: 指針變量名=變量地址; 如 int a,*p; p=&a ; 指向變量的指針變量的初始化: 類型名 *指針變量名=變量地址; 如 int a , *p=&a ;&aap注意指針變量初始化中,&a是賦給p,而不是*p ; 不允許用具體地址值賦值,如p=2000;10#include void main( )int a,b,*pa,*pb,*p; scanf(%d,%d,&a,&b); p

5、a=&a;pb=&b;例 通過指針變量實現(xiàn)兩個數(shù)的交換(1)p=pa;pa=pb;pb=p;printf(a=%d,b=%dn,a,b );3520002002abpa pbp2000200220022000該程序交換的不是a、b的值,而是交換兩個指針變量的值(即指向)。2000實現(xiàn)a、b交換了嗎?例6.3-無法實現(xiàn)!11例 通過指針變量實現(xiàn)兩個數(shù)的交換(2)abpapbt200020022000200235printf(a=%d,b=%dn, a,b );該程序交換的是兩個指針變量所指單元的值,即變量a和b的值。53#include void main( )int a,b,*pa,*pb,t

6、;/*非int*t;*/ scanf(%d,%d,&a,&b); pa=&a;pb=&b;t=*pa;*pa=*pb;*pb=t;3例6.312指針變量與普通變量的對比共性在內(nèi)存中占據(jù)一定大小的存儲單元先定義,后使用類型定義后不能改變(普通變量只能存放所定義類型的數(shù)據(jù),指針變量只能指向所定義類型的存儲單元特殊性指針變量的內(nèi)容只能是地址,而不能是數(shù)據(jù)指針變量只有賦值后才有明確的指向,否則無確定的所指存儲單元可訪問136.2 數(shù)組與指針6.2.1 指向一維數(shù)組的指針數(shù)組的首地址 用數(shù)組名表示int a 10 ;a14int a 10 ;一、一維數(shù)組元素的地址地址1aa+1a+3a+2a+6a+5a

7、+4a+9a+8a+7地址2&a0&a1&a2&a3&a4&a5&a6&a7&a8&a9a0a1a2a3a4a5a6a7a8a9下標法元素引用元素地址相鄰元素的地址偏移量為115int a 10 ;二、一維數(shù)組元素的引用指針法aa+1a+3a+2a+6a+5a+4a+9a+8a+7a0a1a2a3a4a5a6a7a8a9下標法指針法*a*(a+1)*(a+2)*(a+3)*(a+4)*(a+5)*(a+6)*(a+7)*(a+8)*(a+9)元素引用地址2&a0&a1&a2&a3&a4&a5&a6&a7&a8&a9地址1元素地址ai與*(a+i)等價16*(p+i)三、指向一維數(shù)組元素的指針變

8、量 指向數(shù)組元素的指針變量的定義: 類型名 * 指針變量名例:int a10;int *p;p=a; 或p=&a0;pp+iint a 10 ;a,&a0a+i, &aia0,*aai,*(a+i)*p或 int a10, *p=a;或 int a10, *p=&a0;指針位移運算 p+i: 指針變量p位移 i個元素*(p+i)與pi等價,p0,pi176.2.2 指針變量的運算pp+5int a 10 ;a,&a0a+5, &a5a0,*aa5,*(a+ 5)指針比較運算 p2p:地址值大小比較。本例值為 1(真)指針相減運算 p2-p:計算p2與p相距的元素個數(shù)。本例值為5注意:只有對數(shù)組

9、指針變量進行位移、相減和比較運算才有意義; 指針相加運算無意義。指針位移運算 p+i:指針變量p位移 i個元素p2,18(1)指針變量的值可以改變,即可以使用p+、p+=2、p-=3等, 作用是相對于當(dāng)前位置前移或后移若干個存儲單元。 數(shù)組名本身表示數(shù)組的首地址,是常量而不是變量,故不能對數(shù)組名進行自增自減或賦值運算。(2)注意下面幾種運算: *p+與*(p+)等價 (*與+同優(yōu)先等級,右結(jié)合性) *(p+)與*(+p)不等價 (前者先訪問p所指單元再移p到下一單元,后者先移p到下一單元再訪問) (*p)+與*(p+)不等價 (前者是被訪問單元值加1,后者是指針值加1)有關(guān)一維數(shù)組及其指針變量

10、在使用時的注意事項19一維數(shù)組元素輸入和輸出#include void main( ) int a10,i; for ( i=0; i10; i+) scanf(%d, &ai); printf(n); for ( i=0; i10; i+) printf(%5d, ai); printf(n); 方法一:下標法1#include void main( ) int a10,*p=a,i; for ( i=0; i10; i+) scanf(%d, &pi); printf(n); for ( i=0; i10; i+) printf(%5d, pi); printf(n); 下標法2p=a后,

11、p可以當(dāng)作數(shù)組名使用20一維數(shù)組元素輸入和輸出#include void main( ) int a10,i; for ( i=0; i10; i+) scanf(%d, a+i); printf(n); for ( i=0; i10; i+) printf(%5d, *(a+i); printf(n); 方法二:首地址偏移量法1#include void main( ) int a10,*p=a,i; for ( i=0; i10; i+) scanf(%d, p+i); printf(n); for ( i=0; i10; i+) printf(%5d, *(p+i); printf(n)

12、; 首地址偏移量法221一維數(shù)組元素輸入和輸出#include void main( ) int a10,*p=a; for ( ; pa+10; p+) scanf(%d, p); printf(n); for ( p=a; pp1) pmax=p; pnmax=p+1; else pmax=p+1; pnmax=p; for (i=2;i10;i+) if (*pmaxpi) pnmax=pmax; pmax=p+i; else if (*pnmaxpi) pnmax=p+i; printf(max=%d,nmax=%dn,*pmax,*pnmax);習(xí)題6.2 用指針方法求數(shù)組元素中的最

13、大值與次最大值 236.2.3 指向二維數(shù)組的指針一、二維數(shù)組的地址int a 34;aa00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23邏輯結(jié)構(gòu)a00a01a02a03a10a11a12a13a20a21a22a23存儲結(jié)構(gòu)二維數(shù)組的物理結(jié)構(gòu):在內(nèi)存中占用連續(xù)的存儲單元,數(shù)組名為首地址a+1指向何方?24可以將二維數(shù)組的每一行看作一個一維數(shù)組第0行a00 a01 a02 a03 =a0第1行a10 a11 a12 a13 =a1第2行a20 a21 a22 a23 =a2(一)二維數(shù)組的行地址aa+1a+2行地址將二維數(shù)組a看作一個特殊的一維數(shù)組,由3

14、個特殊元素組成,每個特殊元素分別為一個大小為4的一維數(shù)組,數(shù)組名分別為a0、a1和a2注意: 二維數(shù)組的數(shù)組名a是行地址; a+i是指向第 i 行。25 a10a11a12a13(二)二維數(shù)組的元素地址 第1行是數(shù)組名為a1的一維數(shù)組a1a1+1a1+2a1+3注意:ai是第 i 行首元素的地址,不是元素的引用!元素地址第0行a00 a01 a02 a03 =a0第1行a10 a11 a12 a13 =a1第2行a20 a21 a22 a23 =a226a00a02a12a13a03a23a20a11a21a22a10a01二維數(shù)組的元素地址 元素 aij 地址的幾種表示形式: &aij (取

15、地址運算) a0+4*i+j (從數(shù)組首元素地址算起) ai+j (從行首元素地址算起) *(a+i)+j (從首行地址算起) a0a0+4或a1a0+8或a2a0+1a0+6或a1+2a0+11或a2+3a0為首元素地址27例6.10 確定數(shù)組每個成分的大小。#include void main()int a34=0,1,2,3,4,5,6,7,8,9,10,11; printf (The size of a=%un,sizeof(a); printf(The size of a0=%un,sizeof(a0); printf(The size of a00=%un,sizeof(a00 )

16、;程序運行的結(jié)果:The size of a24The size of a08The size of a002可見,a表示整個數(shù)組;a0表示數(shù)組的一行;a00僅表示一個元素。28二、指向二維數(shù)組元素的指針變量指向數(shù)組元素的指針變量的定義: 類型名 *指針變量名如果有:int a34,*p;p=&a00; 或 p=a0;則指針變量p指向了數(shù)組元素a00,于是,*p等價于a00。注意:指向數(shù)組元素的指針變量的一個偏移量是指針移動一個元素,即指針變量的值加1,則指向下一個元素。p=a; 可以嗎?TC+3.0不允許!TC2.0允許,但概念不清!29舉例 輸出二維數(shù)組中的全部元素用元素指針處理#incl

17、ude void main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=a0; pa0+12; p+) if(p-a0%4=0) printf(n); printf(%4d,*p); 例6.12 指針移動法30舉例 輸出二維數(shù)組中的全部元素用元素指針處理#include void main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p,i; p=a0; for (i=0;i12;i+) if (i%4=0) printf(n); printf(%4d,*(p+i); 另解

18、:首地址偏移量法for (i=0;i3;i+) printf(n); for (j=0;j4;j+) printf(%4d,*(p+i*4+j); 或:31三、指向行數(shù)組的指針變量行指針變量的定義: 類型名 (*行指針變量名)N說明:定義行指針變量存放行地址,指向指定類型、列數(shù)為N的二維數(shù)組的行。例如:int a34 , (*p)4 ; p=a;則:行指針變量p指向了整型、具有4個列的二維數(shù)組a的首行。注意:行指針p的大小必須和二維數(shù)組a的列數(shù)一致; 行指針p+i,表示使行指針從當(dāng)前位置開始,向下移動i個偏移量,每個偏移量為一行。32舉例 輸出二維數(shù)組中的全部元素用行指針處理#include

19、void main()int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4=a,i,j; for (i=0;i3;i+) printf(n); for (j=0;j4;j+) printf(%4d,*(*(p+i)+j); P165例6.12另解行指針p被賦予a后,p可以當(dāng)作二維數(shù)組名使用或pij336.3 字符串與指針一、字符串和字符串結(jié)束標志 字符串常量: 兩個雙引號之間的字符序列叫做字符串常量,如abcdefg。字符串結(jié)束標志:系統(tǒng)自動為每一個字符串常量加一個字符串結(jié)束標志0,在內(nèi)存中也占一個字節(jié)。 (注:0的ASCII值為0)字符串常量的存

20、儲長度:字符串中有效字符的個數(shù)加1。系統(tǒng)將字符串常量按一維字符數(shù)組處理。34字符常量和字符串常量的區(qū)別字符常量字符串常量形式用單引號括起來用雙引號括起來字符數(shù)量1個字符大于等于一個字符舉例a、2、*abcdea35二、字符數(shù)組和指向字符串的指針變量(6.3.26.3.4 ) C語言沒有字符串變量,可以通過以下兩種方法實現(xiàn)對字符串的處理字符數(shù)組字符指針變量36(一)字符串的定義字符數(shù)組字符指針變量定義不初始化例:char str14; 定義一個字符型一維數(shù)組,占用4個連續(xù)的字符型存儲單元,其首地址為數(shù)組名str1例:char *str2; 定義一個字符型指針變量,占用1個指針型存儲單元但無值,因

21、為字符型存儲單元未分配,指針變量str2無明確指向str1是常量str2是變量初始化例:char str1=abc; 定義一個字符型一維數(shù)組,占用4個連續(xù)的字符型存儲單元存放abc,其首地址為數(shù)組名str1例:char *str2=abc; 定義一個字符型指針變量,占用1個指針型存儲單元,另分配4個連續(xù)的字符型存儲單元存放abc,其首地址存放在指針變量str2中37(二)字符串的賦值(=)字符數(shù)組例:char str14;字符指針變量例:char *str2;賦值整體賦值str1=def;不合法! 不允許對數(shù)組名賦值,因為數(shù)組名是常量! 可使用strcpy函數(shù)對字符數(shù)組整體賦值 str2=de

22、f;合法! 允許對字符型指針變量賦字符串,作用是分配4個連續(xù)的字符型存儲單元,其首地址存放在指針變量str2中逐個字符賦值例:str10=d; str11=e; str12=f; str13=0;例:*str2=d; *(str2+1)=e; *(str2+2)=f; *(str2+3)=0;前提:字符指針已有明確的指向38(三)字符串的輸入字符數(shù)組例:char str4; 字符指針變量 前提:字符指針有明確的指向例:char c4,*str=c;例:char *str=abc;輸入整體輸入方法1)用scanf函數(shù): scanf(%s, str); 注意:所輸入的字符串以空格或回車鍵結(jié)束,故不

23、能輸入含有空格的串。方法2)用gets函數(shù): gets(str); 注意:所輸入的字符串以回車鍵結(jié)束,串中可以包含空格。逐個字符輸入(不提倡使用)例:for(i=0; (stri=getchar()!=n; i+); stri=0; /*將n改為0 */例6.14( P168 )39字符串輸入舉例aabb0?char c10; scanf(%s, c);如果從鍵盤上輸入:aabbccgets(c);aabbcc0?如果從鍵盤上輸入:aabbccgets函數(shù)格式:gets(串地址)功能:從鍵盤上輸入一個字符串到指定地址開始的存儲空間中。 (P174)對s,回車或空格是輸入結(jié)束符,并自動轉(zhuǎn)換成0存

24、儲對gets,回車是輸入結(jié)束符,并自動轉(zhuǎn)換成0存儲40(四)字符串的輸出字符數(shù)組例:char str4 =abc;字符指針變量例:char c4,*str=c;例:char *str=abc;輸出整體輸出方法1)用printf函數(shù): printf(%sn, str); 注意:遇0結(jié)束輸出 (0不輸出) 。方法2)用puts函數(shù): puts(str); 注意:遇0結(jié)束輸出并將0作為回車換行(n)輸出。逐個字符輸出(不提倡使用)例:for(i=0; stri!=0; i+) printf(%c, stri);例:for(p=str; *p!=0; p+) /* char *p; */ putcha

25、r(*p); 或 stri或 *p不常用這類方式輸出字符串,但常用這類方式控制字符的逐一處理。41puts( )函數(shù)使用舉例abcd?#include void main( ) char c10 ; int i ; for( i=0 ; i4 ; i+ ) ci=a+i ; puts( c ) ; ci= 0;abcd0?abcd隨機字符abcd(輸出后換行)c:puts函數(shù)格式:puts(字符串)功能:輸出指定的字符串,并自動將0轉(zhuǎn)換為回車換行 (n)輸出。 (P175)42 字符串輸出:puts(串) 字符串輸入:gets(串地址) 串2復(fù)制到串1:strcpy(串1地址,串2) 串1串2

26、大小比較:strcmp(串1,串2) 串2連接到串1:strcat(串1地址,串2) 求串的實際長度:strlen(串) 串大小寫轉(zhuǎn)換:strlwr(串) ,strupr(串) #include stdio.h#include string.h二、字符串處理函數(shù) (6.3.5 +6.3.6)串常量或串地址43strcpy( )函數(shù)字符串復(fù)制函數(shù)格式: strcpy(串1地址,串2)功能:將字符串2(連同結(jié)束標志0)復(fù)制到串1地址所指的存儲空間中。注意:串1地址所指的存儲空間必須已分配且足夠大,以便容納字符串2。44strcpy( )函數(shù)應(yīng)用舉例: #include #include void

27、main( ) char a6=China, b=FZ; strcpy(a,b ) ; strcpy(b, 10) ; puts( a ); puts( b); 輸出:FZ 10不允許:a=b; b = 10; 45P178例6.21 將字符串s1復(fù)制到字符串s2,即實現(xiàn):strcpy(s2,s1) 下標法 字符指針法 i=0當(dāng)s1i!=0 s2i=s1i i+ s2i= 0 輸出s2 from=s1, to=s2當(dāng)*from!=0 *to=*from to+, from+ *to= 0 輸出s2編程實現(xiàn)strcpy( )功能46#include void main ( ) char s1 =

28、Hello,World!,s215; char *from=s1,*to=s2; while(*from) /*代表while(*from!=0)*/ *to=*from; to+; from+; *to=0; puts(s1); puts(s2); 例6.21 實現(xiàn)strcpy(s2,s1) 字符指針法:47 while(*from) *to=*from; to+; from+; *to=0;簡化 while(*from) *to+=*from+; *to=0;例6.21的以下程序段可簡化: 簡化 while( (*to+=*from+)!=0 ) ;48strcat( )函數(shù)字符串連接函數(shù)

29、格式: strcat(串1地址,串2)功能:將字符串2(連同結(jié)束標志0)接到字符串1的后面(0位置開始) 。例:#include #include void main( ) char c120=abcde, *c2=12345; strcat( c1 , c2 ) ; puts( c1 ); 輸出: abcde12345注意:串1地址所指的存儲空間必須已分配且足夠大,以便容納連接后的新字符串。49P179例6.23 將字符串s2連接到字符串s1的后面,即實現(xiàn):strcat(s1,s2) 下標法 字符指針法 i=0 當(dāng)s1i!= 0 i+ j=0當(dāng)s2j!= 0 s1i+=s2j+ s1i= 0

30、 輸出s1 p1=s1 當(dāng)*p1!= 0 p1+ p2=s2當(dāng)*p2!= 0 *p1+=*p2+ *p1= 0 輸出s1編程實現(xiàn)strcat( )功能50strcmp( )函數(shù)字符串比較函數(shù)格式:strcmp(串1,串2)功能:比較字符串1和字符串2的大小比較方式:逐個字符比較;按ASCII碼比較;遇到第一對不同的字符或者有一個字符串結(jié)束停止。返回值:返回兩個字符串中第一對不同字符的ASCII碼值之差。 若返回值等于0,表示串1等于串2; 若返回值大于0,表示串1大于串2; 若返回值小于0,表示串1小于串2。 51strcmp(abcde,ad ) b-d= -2strcmp(abcde,ad

31、 )=-2 abcde小于adad0abcde0strcmp(abcde,ab ) c-0= 99strcmp(abcde,ab )=99 abcde大于abab0abcde0strcmp(ab,ab ) 0-0=0strcmp(ab,ab )=0兩串相等ab0ab0strcmp( )函數(shù)比較過程52#include void main ( )char s180,s280,*str1=s1,*str2=s2; int i,d=0; printf(Input string s1 and s2 :n); gets(str1); gets(str2); while (*str1 & *str2) /

32、* str1、str2均未到0 */ d=*str1-*str2; if (d!=0) break; /*對應(yīng)字符不等,結(jié)束比較*/ str1+, str2+; if (d=0) /*前一對字符相等,本對字符中至少一個是0 */ d= *str1-*str2; printf(%dn,d); 編程實現(xiàn)strcmp( )功能P178例6.22 利用字符指針比較字符串s1和s2的大小,即實現(xiàn)strcmp(s1,s2)53#include void main ( )char s180,s280,*str1=s1,*str2=s2; int i,d; printf(Input string s1 and

33、 s2 :n); gets(str1); gets(str2); while (*str1 = *str2 & *str1) str1+, str2+; d= *str1-*str2; printf(%dn,d); 例6.22算法改進編程實現(xiàn)strcmp( )功能/* 當(dāng)對應(yīng)字符相等且 均未到0 ,繼續(xù) 比較下一對字符 */54strlen( )函數(shù)求字符串實際長度函數(shù)格式: strlen(字符串)功能: 求字符串的實際長度,不包括0。返回值:返回整型數(shù)據(jù),其大小為字符串中有效字符的個數(shù)。#include #include void main ( ) char a10=12345 ; char

34、 *b=123045; char *c=123085; char d5=12345; char *e=12345; printf(%dn%dn%dn%dn%dn,strlen(a), strlen(b),strlen(c),strlen(d),strlen(e); 輸出:6 43(不確定數(shù))5045是轉(zhuǎn)義字符!55#include void main ( ) char s180,*str1=s1; int len=0; gets(str1); while(*str1!=0) len+; str1+; printf(len=%dn, len); 編程實現(xiàn)strlen( )功能56strlwr(

35、)函數(shù)轉(zhuǎn)換生成小寫字母串格式: strlwr(字符串)功能: 將字符串中的大寫字母轉(zhuǎn)換成小寫字母,其它字符不變strupr( )函數(shù)轉(zhuǎn)換生成大寫字母串格式: strupr(字符串)功能: 將字符串中的小寫字母轉(zhuǎn)換大寫字母,其它字符不變57#include void main ( ) char s1 =BeiJing2008, *str1; str1=s1; while(*str1!=0) if (*str1=A) & (*str1=Z) *str1+=32; str1+; puts(s1); P180例6.24(1)實現(xiàn):strlwr(s1) 編程實現(xiàn)strlwr( )功能58三、字符串應(yīng)用舉

36、例 字符串復(fù)制(不用strcpy函數(shù)) 字符串連接(不用strcat函數(shù)) 字符串比較(不用strcmp函數(shù)) 求字符串實際長度 轉(zhuǎn)換生成小寫字母串(不用strlwr函數(shù))- 將字符串反向 刪除串中空格 將數(shù)字串轉(zhuǎn)換為整型數(shù) 將正整數(shù)轉(zhuǎn)換為數(shù)字串 將十進制正整數(shù)轉(zhuǎn)換為十六進制數(shù) 字符串加密59#include void main ( ) char str50, *p1, *p2, temp; printf(Enter string:); gets(str); p1 = p2 = str; while ( *p1 ) p1+; /* 找到串結(jié)束標記0 */ p1-; /* 指針p1指向串中的最后

37、一個字符 */ while ( p2p1 ) temp = *p2; /* 交換兩個指針所指向的字符 */ *p2+ = *p1; /* p2向串尾方向移一位 */ *p1- = temp; /* p1向串首方向移一位 */ puts(str); 例6.27 舉例 將字符串反向60舉例 刪除一個字符串中所有的空格字符例6.25輸入字符串sp1=s, p2=s當(dāng)*p1!=0真 假p1+*p2=*p1 p1+, p2+*p2=0輸出 sp1依次指向刪空格前的s串的各個字符 p2依次指向接收非字符的各個位置*p1為空格 61#include void main ( ) char s8,*p=s; l

38、ong int n=0; int d; gets(s); while(*p) d=*p-0; n=n*10+d; p+; printf(%ldn,n); 例6.26 如: 1234 1234思路:1234 1 1 n=11234 2 2 n=n*10+2=121234 3 3 n=n*10+3=1231234 4 4 n=n*10+4=1234-|-|- *p d=*p-0 n=n*10+d舉例 將數(shù)字串轉(zhuǎn)換為整型數(shù)將數(shù)字字符轉(zhuǎn)換為數(shù)字值,或*p-48 62如: 1234 1234思路:a=1234 4 4 s=4a=123 3 3 s=43a=12 2 2 s=432a=1 1 1 s=43

39、21|-|-|-a b *p= = =a/10 a%10 b+0舉例 將正整數(shù)轉(zhuǎn)換為數(shù)字串將數(shù)字字符轉(zhuǎn)換為數(shù)字值,或*p-48 #include #include void main()long a; char s8,*p=s; int b,i; scanf(%ld,&a); while (a0) b=a%10; *p=0+b; a=a/10; p+; *p=0; 將s串反向存放后輸出 或直接反序輸出 63如: 1234 4D2思路:a=1234 b=a%16=2 2 s=2a=a/16=77 b=a%16=13 D s=2Da=a/16=4 b=a%16=4 4 s=2D4|-|-|-a b

40、 *p= = =a/16 a%16 b+0(b9)舉例 將十進制正整數(shù)轉(zhuǎn)換為十六進制數(shù) 09之間的數(shù)轉(zhuǎn)換為十六進制數(shù)碼0 91015之間的數(shù)轉(zhuǎn)換為十六進制數(shù)碼A F64舉例 字符串加密密碼轉(zhuǎn)換規(guī)律: 假設(shè)k=4,將字母A變成字母E,字母a變成e,即變成其后的第四個字母,字母W變成A,X變成B,Y變成C,Z變成D。非字母不變。A65MGRDV 86B66C6769 E 70 FIJKLNOPQSTUW 87X 88YZ90H習(xí)題4.28 先輸入數(shù)字k(0k10),再將輸入的一行字符中的英文字母轉(zhuǎn)換為其后續(xù)的第k個字母輸出,字母超出最后一個“Z”或“z”時,循環(huán)轉(zhuǎn)換,數(shù)字不轉(zhuǎn)換。 65getcha

41、r()用來“吃掉”跟在k值后輸入的回車鍵字符串加密程序#include void main( ) char s80,*p=s; int k; printf(input k: ); scanf(%d,&k); printf(input string: ); getchar(); gets(s); puts(s); while ( *p!= 0 ) p+; if ( *p=A&*p=a&*pZ&*pz&*p=z+k ) *p=*p-26; 習(xí)題4.28運行舉例:input k: 3input string: Agte%f32xz7YDjwh%i32ac7B 66補遺:字符數(shù)組的初始化舉例 char

42、 a5 = 1234 char b35 = 1234 , ABCD , abcd ;或:char a5 = 1234 char b35 = 1234 ,ABCD ,abcd ; char b35 = 1,2,3,4,0 ,A,B,C,D,0 , a,b,c,d,0 ;以下不提倡使用: char a5 = 1,2,3,4,0 char b35 = 1,2,3,4,0,A,B,C,D,0, a,b,c,d ,0 ;以上各數(shù)組的第一維大小均可??!676.4 指針數(shù)組和指向指針的指針一個數(shù)組,如果其中的各個元素均為指針類型,則這個數(shù)組稱為指針數(shù)組。如果一個指針變量指向指針類型的數(shù)據(jù),則這個指針變量稱為

43、指向指針的指針。主要應(yīng)用在字符串處理上 68一、指針數(shù)組的概念指針數(shù)組的定義:類型名 *數(shù)組名常量表達式;如: int *p4;表示數(shù)組p是一個具有4個元素的一維數(shù)組,每個數(shù)組元素都是一個指向整型數(shù)據(jù)的指針,即每個元素都是一個整型變量的地址。 注意區(qū)別: int (*p)4; 行指針 int *p4; 指針數(shù)組69例6.29 通過指針數(shù)組元素訪問int型二維數(shù)組的元素。#include void main() int a34=0,1,2,3,4,5,6,7,8,9,3,6; int *pa3; int i,j; for (i=0;i3;i+) pai=ai; for (i=0;i3;i+) f

44、or(j=0;j4;j+) printf(a%d%d=%d ,i,j,*(pai+j); /* *(pai+j) 與*(ai+j)、*(*(a+i)+j)、aij均等效*/ printf(n); 指針數(shù)組的元素只能存放地址!指向首元素70二、字符指針數(shù)組與二維字符數(shù)組應(yīng)用比較二維字符數(shù)組定義char s68=FORTRAN,PASCAL,BASIC,COBOL,C,C+ ; 字符指針數(shù)組定義char *ps6=FORTRAN,PASCAL,BASIC,COBOL,C,C+ ; 結(jié)論一:處理不等長字符串時,字符指針數(shù)組比二維字符數(shù)組節(jié)省存儲空間。二維字符數(shù)組s每行存放一個字符串,按最長串的長度為

45、各串分配存儲空間指針數(shù)組ps每個元素存放一個字符串的首地址,按各串實際長度分配存儲空間指向首字符71舉例:將若干個字符串按升序輸出 char temp8; int i,j,k; for(i=0;i5;i+) /*選擇排序法*/ k=i; for(j=i+1;j0) k=j; if (k!=i) strcpy(temp,sk); srrcpy(sk, si); strcpy(si,temp); 排序后的字符數(shù)組解1)例6.28用二維字符數(shù)組核心程序段:交換sk與si所存放的字符串,實質(zhì)上是逐個字符交換72將若干個字符串按升序輸出 char *temp; int i,j,k; for(i=0;in-1;i+) /*選擇排序法*/ k=i; for(j=i+1;j0) k=j; if (k!=i) temp=psk; psk=psi; psi=temp; 結(jié)論二:用指針數(shù)組指向若干個字符串,使字符串處理更加方便靈活。解2)例6.31用指針數(shù)組核心程序段:排序后的指針數(shù)組交換psk與psi的指向,比交換字符串節(jié)省時間73三、二級指針(指向指針的指針)二級指針的定義:類型名 *變量名;如: int a, *p

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論