版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C語言及程序設計(強)
(00814024)指針與字符串指針
——指針概念指針基本概念變量信息:值和地址指針:地址指針變量:值為地址的變量指針變量定義:變量名前帶*int*p;p是一個變量,為指針變量p的值是一個int類型變量的地址取址運算符(&):對一般變量取其地址取值運算符(*):對指針變量取地址所存數(shù)據(jù)指針使用舉例intn,m;int*p;scanf("%d",&n);p=&n;m=*p;printf("%d\n",m);m=n;指針
——指針與數(shù)組指針與一維數(shù)組inta[]={10,11,12,13,14};int*p;p=&a[0];變量訪問的等價性n=a[2];a[2]+=n;n=*(p+2);*(p+2)+=n;n←12a[2]←24數(shù)組名作為指針常量a指向a[0],a+2指向a[2]*a即a[0],*(a+2)即a[2]p+2與a+2*(p+2)與*(a+2)數(shù)組與指針的共同點通過基地址+偏移量方式訪問元素數(shù)組方式:數(shù)組名+下標指針方式:首地址+偏移數(shù)組名作為指針常量,inta[10];元素:
a[i]等同于*(a+i)首地址:&a[i]等同于a+i指針作為數(shù)組名,int*p;指向數(shù)組的第一個元素=指向整個數(shù)組元素:*(p+i)等同于p[i]首地址:p+i
等同于&p[i]指針
——指針與函數(shù)指針的交換交換指針int*p,*q,*t;t=p;p=q;q=t;交換指針所指數(shù)據(jù)int*p,*q,t;t=*p;*p=*q;*q=t;編寫函數(shù),交換兩數(shù)#include<stdio.h>voidswap(int*p,int*q){
intt;t=*p;*p=*q;*q=t;}main(){
intx,y;
scanf("%d%d",&x,&y);swap(&x,&y);
printf("x=%d,y=%d\n",x,y);}調(diào)用swap函數(shù)的內(nèi)存結(jié)構(gòu)圖指針
——指針應用find函數(shù):查找并返回下標/下標法intfind(inta[],intn,intx){
inti;for(i=0;i<n;i++)if(a[i]==x)returni;return-1;}pfind函數(shù):查找并返回指針/下標法int*pfind(inta[],intn,intx){
inti;for(i=0;i<n;i++)if(a[i]==x)return
&a[i];return
NULL;}pfind函數(shù):查找并返回指針/指針法int*pfind(inta[],intn,intx){
int
*p;for(p=a;p<a+n;p++)if(*p==x)returnp;returnNULL;}指針
——動態(tài)內(nèi)存動態(tài)內(nèi)存分配與釋放動態(tài)內(nèi)存分配函數(shù)void*malloc(unsignedsize);內(nèi)存釋放函數(shù)voidfree(void*buffer);分配與釋放n個整數(shù)的空間int*p;p=(int*)malloc(n*sizeof(int)); /*分配*/…… /*使用該分配空間*/free(p); /*釋放*/輸入n和n個整數(shù)…main(){
int
*a,n,i;
scanf(“%d”,&n);a=(int*)malloc(n*sizeof(int));for(i=0;i<n;i++)
scanf(“%d”,&a[i]);……/*指針a可作為數(shù)組名使用*/……
free(a);}指針(擴展)
——特殊指針指針數(shù)組多個指針組成的數(shù)組,如char*pa[10];或如圖初始化二級指針char**p2;p2=pa;或p2=&pa[0];第i個姓名:names[i]或pa[i]或p2[i]或*(p2+i)第i個姓名的第j個字符
names[i][j]或pa[i][j]或p2[i][j]
或*(pa[i]+j)或*(*(p2+i)+j)函數(shù)指針指向函數(shù)的指針返回類型(*指針變量名)(函數(shù)形參表);如:double(*pfunc)(double);函數(shù)指針指向函數(shù)有庫函數(shù):doublesin(double);如:pfunc=sin;通過指針調(diào)用函數(shù)如:y=(*pfunc)(x);等價于y=sin(x);函數(shù)指針數(shù)組如:double(*pfs[3])(double);命令行參數(shù)main(int
argc,char*argv[])或main(int
argc,char**argv)如程序命令:07ARGcomputerlanguage數(shù)組
——字符串字符串字符串常量字符串表示——數(shù)組法字符串輸出字符串輸入常用字符串函數(shù)程序舉例字符串常量使用雙引號:"Hello"連續(xù)的字符序列'H','e','l','l','o','\0'字符尾部追加'\0'字符字符串的實質(zhì)是指針字符串在內(nèi)存的首地址區(qū)分"A"和'A'Hello\0地址值0x3000'H'0x3001'e'0x3002'l'0x3003'l'0x3004'o'0x3005'\0'…地址為假設數(shù)組表示charstr[8]="Hello";字符數(shù)組str有8個元素前5個為字符H、e、l、l、o第6個為字符串結(jié)束符\0后2個為二進制0字符串長度等于'\0'所在下標地址值變量0x2000'H'str[0]0x2001'e'str[1]0x2002'l'str[2]0x2003'l'str[3]0x2004'o'str[4]0x2005'\0'str[5]0x20060str[6]0x20070str[7]str字符串輸入輸出函數(shù)charstr[80];
char*p;輸出函數(shù)puts(str); 等價于printf("%s\n",str);puts(p); 等價于printf("%s\n",p);輸入函數(shù)gets(str); 相當于scanf("%s",str);gets(p); 相當于scanf("%s",p);gets輸入一行,以回車結(jié)束scanf("%s",…)輸入一個單詞以空格、TAB和回車結(jié)束#include<stdio.h>字符串輸出數(shù)組法charstr[]="Hello,world!";printf("%s\n",str);或puts(str);字符串輸入數(shù)組法charstr[80];scanf("%s",str);或gets(str);字符串輸入時必須先用數(shù)組法開好空間字符串常用函數(shù)(1)#include<string.h>計算并返回字符串長度函數(shù)聲明:int
strlen(char*p);函數(shù)聲明:int
strlen(char
str[]);區(qū)別strlen
與sizeof/計算存貯空間charstr[80]="Hello";strlen(str)為5,strlen("Hello")為5sizeof(str)為80,sizeof("Hello")為6下標[0][1][2][3][4][5][6]…[79]strHello\0???字符串的循環(huán)處理按長度循環(huán)charstr[80];gets(str);n=strlen(str);for(i=0;i<n;i++)
putchar(str[i]);putchar('\n');按結(jié)束標志循環(huán)\0所在下標即為字符串長度charstr[80];gets(str);for(i=0;str[i]!='\0';i++)
putchar(str[i]);printf("\n");下標[0][1][2][3][4][5][6]…[79]strHello\0???字符類函數(shù)(擴展)#include<ctype.h>庫函數(shù)判斷字母:isupper,islower,isalpha判斷數(shù)字:isdigit,isalnum轉(zhuǎn)換大小寫:toupper,tolower設charc;if(islower(c))等價if(c>='a'&&c<='z')c=toupper(c)等價if(c>='a'&&c<='z')c=c-'a'+'A';輸入一行字符串,小寫轉(zhuǎn)換為大寫,再輸出#include<stdio.h>main(){chara[80];inti;
gets(a);for(i=0;a[i]!='\0';i++)
/*i<strlen(a)*/if(a[i]>='a'&&a[i]<='z')/*islower(a[i])*/
a[i]=a[i]-'a'+'A';/*a[i]=toupper(a[i])*/
puts(a);}篩選小寫字符并生成字符串int
i,n;charstr[80];gets(str);n=strlen(str);for(i=0;i<n;i++)if(islower(str[i]))
putchar(str[i]);putchar('\n');chara[80],b[80];int
i,k,n;gets(a);n=strlen(a);k=0;for(i=0;i<n;i++)if(islower(a[i]))
b[k++]=a[i];b[k]='\0';puts(b);字符串常用函數(shù)(2)#include<string.h>字符串復制(將字符串s2復制到s1中)函數(shù)聲明:char*strcpy(char*s1,char*s2);函數(shù)聲明:char*strcpy(chars1[],chars2[]);例如:charstr[80];strcpy(str,"Hello");下標[0][1][2][3][4][5][6]…[79]原str?????????新strHello\0???字符串常用函數(shù)(3)#include<string.h>字符串連接(將字符串s2拼接到s1后)函數(shù)聲明:char*strcat(char*s1,char*s2);函數(shù)聲明:char*strcat(chars1[],chars2[]);例如:charstr[80]="He";strcat(str,"llo");下標[0][1][2][3][4][5][6]…[79]原strHe\0??????新strHello\0???字符串常用函數(shù)(4)#include<string.h>字符串比較(字典順序,s1在后則>0)函數(shù)聲明:int
strcmp(char*s1,char*s2);函數(shù)聲明:int
strcmp(chars1[],chars2[]);例如:chara[80]="A123",b[50]="A4";則strcmp(a,b)<0為真下標[0][1][2][3][4][5]…[49]…[79]aA123\0?????bA4\0?????字符串與整型數(shù)使用比較intm,n;scanf("%d",&m);printf("%d",m);m=5;n=m;if(m<n)m++;m+=n;chara[80],b[80];scanf("%s",a);或gets(a);printf("%s",a);或puts(a);strcpy(a,"Hello");strcpy(b,a);if(strcmp(a,b)<0)n=strlen(a);strcat(b,a);例輸入一行字符串,將字符串的所有字符后移5個字符后輸出,最后的5個字符移到頭部如輸入:Ab12,#$xyzWQ則輸出:xyzWQAb12,#$輸入部分chara[80];intn;gets(a);n=strlen(a);n為字符個數(shù),同時n下標對應\0結(jié)束符如輸入:Ab12,#$xyzWQ012345…n-5n-4n-3n-2n-1n…aAb12,#$xyzWQ\0?后移5字符
(字符串函數(shù))main(){chara[80],b[80];
int
n,i,k;gets(a);n=strlen(a);strcpy(b,a+n-5);
strcat(b,a);
a[n]='\0';puts(b);}012345…n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0bxyzWQAb12,#$\0后移5字符(分段輸出法)main(){chara[80];intn,i;gets(a);n=strlen(a);for(i=n-5;i<=n-1;i++)
putchar(a[i]);
for(i=0;i<n-5;i++)
putchar(a[i]);
putchar('\n');}012345…n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0后移5字符(分段生成法)main(){chara[80],b[80];
int
n,i,k;gets(a);n=strlen(a);…………puts(b);}k=0;for(i=n-5;i<=n-1;i++)
b[k++]=a[i];for(i=0;i<n-5;i++)
b[k++]=a[i];b[k]='\0';012345…n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0bxyzWQAb12,#$\0后移5字符(下標計算法)main(){chara[81],b[81];int
n,i;gets(a);n=strlen(a);…………puts(b);}for(i=0;i<=n-1;i++)b[(i+5)%n]=a[i];b[n]='\0';推導公式:
i→(i+5)%n0→5,1→6,2→7n-7→n-2,n-6→n-1n-5→0,n-4→1,n-3→2n-2→3,n-1→401234n-7n-6n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0bxyzWQAb12,#$\0其它字符串函數(shù)(擴展)字符串比較,不區(qū)分大小寫int
stricmp(chars1[],chars2[]);字符串所有小寫轉(zhuǎn)換為大寫char*strupr(chars[]);字符串所有大寫轉(zhuǎn)換為小寫char*strlwr(chars[]);庫函數(shù)的實現(xiàn)代碼例,字符串小寫轉(zhuǎn)大寫char*my_strupr(chars[
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勤儉節(jié)約護家園國旗下講話稿范文(5篇)
- 虛擬現(xiàn)實與仿真技術(shù)-洞察分析
- 值班打瞌睡檢討書范文(10篇)
- 以案例為基礎的學生解決問題能力培養(yǎng)
- 以人為本的辦公綠植設計與實踐
- 創(chuàng)新教學策略在小學科學課堂的應用
- 創(chuàng)新視角下的理論宣講在學術(shù)界的實踐
- 健康飲食在校園教育中的實踐與思考
- 從零到一如何制定展會營銷活動計劃并實施
- 企業(yè)員工的休息空間優(yōu)化策略
- 蔬菜產(chǎn)品供貨合同范例
- 品管圈PDCA獲獎案例-心內(nèi)科降低心肌梗死患者便秘發(fā)生率醫(yī)院品質(zhì)管理成果匯報
- 2023年初級會計師《初級會計實務》真題及答案
- 江南大學《人工智能》2022-2023學年第一學期期末試卷
- 初中物理教師個人校本研修工作計劃(20篇)
- 2024-2025學年三年級上冊道德與法治統(tǒng)編版期末測試卷 (有答案)
- 2025蛇年學校元旦聯(lián)歡晚會模板
- 廣東省潮州市潮安區(qū)2023-2024學年八年級上學期期末考試英語試題-A4
- 2024年度租賃期滿退房檢查清單:租戶與房東的交接確認單
- 種子生產(chǎn)與經(jīng)營基礎知識單選題100道及答案解析
- 江蘇省揚州市2023-2024學年高一上學期1月期末考試 物理 含解析
評論
0/150
提交評論