版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章指針學(xué)習(xí)目標(biāo)掌握定義指針的方法,掌握指針的基本操作;掌握利用指針作為函數(shù)參數(shù)傳遞數(shù)據(jù)的方法;掌握一維數(shù)組指針和行指針的概念和應(yīng)用主要內(nèi)容指針的概念指針變量的定義指針的基本操作指針變量的簡(jiǎn)單應(yīng)用指針作為函數(shù)參數(shù)一維數(shù)組的指針行指針
7.3指針和數(shù)組一.一維數(shù)組的指針1.一維數(shù)組指針的概念在C語言中,一維數(shù)組的數(shù)組名表示數(shù)組存放的首地址,稱其為數(shù)組的指針。顯然,該指針與數(shù)組首元素的指針有相同的值。2000H52004H42008H3200CH22010H1定義一維數(shù)組intarr[5]={5,4,3,2,1};并假定數(shù)組在內(nèi)存中從2000H開始存放。則:數(shù)組名arr就是數(shù)組arr的指針,arr的值為數(shù)組的存儲(chǔ)地址2000H。顯然,數(shù)組元素arr[0]的指針也是2000H,數(shù)組元素arr[1]的指針是2002H,……。在C程序中,執(zhí)行語句:printf("%x",arr);
即可輸出一維數(shù)組arr的指針。一維數(shù)組指針和數(shù)組元素指針的關(guān)系
數(shù)組名+i指向數(shù)組第i個(gè)元素例如:arr是數(shù)組arr[]的指針,則
arr+i指向數(shù)組arr[]的第i個(gè)元素,即:
arr+i=&arr[i]【例7-6】從鍵盤輸入10個(gè)整數(shù),然后逆序輸出。
#include<stdio.h>
voidmain()
{inta[10],i,*p;printf("PleaseinputtenIntegers:\");for(i=0;i<=9;i++)scanf("%d",a+i);for(p=a+9;p>=a;p--)printf("%d,",*p);printf("\n");}
注意:(1).指針變量可以施行自加、自減運(yùn)算,p++或++p使指針變量指向數(shù)組當(dāng)前元素的下一個(gè)元素,而p--或--p使指針變量指向數(shù)組當(dāng)前元素的前一個(gè)元素。(2).數(shù)組名a是數(shù)組的首地址,是一個(gè)常量,所以不可以施行自加、自減運(yùn)算。(3).如果指針變量p指向數(shù)組的某一個(gè)元素a[i],則*p++表示讀取a[i]的值后,再使p指向a[i+1]??梢灶愃频乩斫?p--。(4).如果指針變量p指向數(shù)組的某一個(gè)元素a[i],則--*p表示先使p指向a[i-1],再讀取a[i-1]的值。可以類似地理解++*p。(5).如果指針變量p指向數(shù)組的某一個(gè)元素a[i],則(*p)++表示讀取a[i]的值后,執(zhí)行a[i]+=1,而p的指向不變。可以類似地理解(*p)--。
(6).*p++和*(p++)、*p--和*(p--)的運(yùn)算結(jié)果是一樣的?!纠?-7】從鍵盤輸入5個(gè)數(shù),輸出其中的最大值和最小值。#include<stdio.h>intmax,min;voidf(int*arr,intn)
{int*p,*arr_end;arr_end=arr+n;max=min=*arr;for(p=arr+1;p<arr_end;p++){if(*p>max)max=*p;elseif(*p<min)min=*p;}}main(){inti,a[5],*p1=a;printf("PleaseInputFiveIntegers:\n");for(;p1<a+5;p1++)scanf("%d",p1);p1=a;f(p1,5);printf("max=%d,min=%d\n",max,min);}形式參數(shù)為指針變量實(shí)在參數(shù)為指針數(shù)組名就是數(shù)組的指針二.二維數(shù)組的指針1.行指針的概念
二維數(shù)組的數(shù)組名表示數(shù)組存儲(chǔ)的首地址。例如,定義二維數(shù)組:inta[3][4]={{2,4,6,8},{10,12,14,16},{18,28,22,24}};設(shè)數(shù)組a存儲(chǔ)在從2000H開始的存儲(chǔ)單元中。(圖中假設(shè)int占2字節(jié))
數(shù)組名a指向數(shù)組存儲(chǔ)的首地址2000H。但a+1不是指向a[0][1]的存儲(chǔ)單元,而是指向二維數(shù)組第1行的存儲(chǔ)首地址2008H,a+2指向二維數(shù)組第2行的存儲(chǔ)首地址2010H..….。確切地說,數(shù)組名a指向二維數(shù)組第0行的存儲(chǔ)首地址2000H。注意:
稱二維數(shù)組各行的存儲(chǔ)首地址為該行的行指針,是以二維數(shù)組的行為存儲(chǔ)單位的地址。二維數(shù)組的行指針和數(shù)組元素指針的關(guān)系
*(數(shù)組名+i)+j指向二維數(shù)組第i行、第j列的元素而*(*(數(shù)組名+i)+j)即是取出第i行、第j列的元素值。例如:a是二維數(shù)組a[]的行指針,則*(a+i)+j指向數(shù)組a[]的第i行、第j列的元素,即:*(a+i)+j=&a[i][j]
而:*(*(a+i)+j)即是取出a[i][j]的值。為了使用行指針,需要定義行指針變量。定義行指針變量的格式:類型說明符(*行指針變量名)[數(shù)組的列元素個(gè)數(shù)];對(duì)二維數(shù)組a[3][4],定義行指針變量:int(*p)[4];
其中:(*p)表示p是行指針變量,[4]表示該行指針變量指向的行有4個(gè)列元素,int表示二維數(shù)組的元素為整型變量?!纠?-8】以二種不同的方式輸出數(shù)組元素a[i][j]的存儲(chǔ)單元地址和值。#include<stdio.h>voidmain()
{inta[2][2]={{2,4},{6,8}},i,j;int(*p)[2]=a;for(i=0;i<=1;i++)for(j=0;j<=1;j++){printf("Address1ofa[%d][%d]is%x",i,j,*(p+i)+j);printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));printf("Address2ofa[%d][%d]is%x",i,j,*(a+i)+j);printf("a[%d][%d]=%d\n",i,j,*(*(a+i)+j));}}用二維數(shù)組a的數(shù)組名a對(duì)行指針變量p作初始化行指針的方法輸出數(shù)組元素a[i][j]的指針和值
用二維數(shù)組名的方法輸出數(shù)組元素a[i][j]的指針和值【例7-9】用行指針的方法計(jì)算并輸出二維數(shù)組a各行元素的和。
#include<stdio.h>
voidmain()
{inta[3][4]={{2,4,6,8},{10,12,14,16},{18,20,22,24}};int(*p)[4]=a,i=0,j;for(p=a;p<=a+2;p++,i++){intsum=0;for(j=0;j<=3;j++)sum+=*(*p+j);printf("SumofRow%dis%d\n",i,sum);}}【例7-10】用訪問一維數(shù)組的方法輸出二維數(shù)組所有元素的和。
#include<stdio.h>
voidmain()
{inta[3][4]={{2,4,6,8},{10,12,14,16},{18,20,22,24}};inti,j,sum=0,*p=&a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)sum+=*(p+i*4+j);printf("SUM=%d\n",sum);}用二維數(shù)組a[][]元素a[0][0]的地址對(duì)指針變量p作初始化,p+1指向a[0][1]……【例7-13】通過函數(shù)調(diào)用求二行四列矩陣的最大元素值。#include<stdio.h>
intmax(int(*p)[4]){inti,j,m;m=**p;for(i=0;i<=1;i++)for(j=0;j<=3;j++)if(*(*(p+i)+j)>m)m=*(*(p+i)+j);return(m);}main(){inta[2][4],i,j;printf("PleaseInputEightIntegers:\n");for(i=0;i<=1;i++)for(j=0;j<=3;j++)scanf("%d",&a[i][j]);printf("MAX=%d\n",max(a));}形參為行指針變量即:*(*(p+0)+0)實(shí)參為二維數(shù)組的數(shù)組名
三、字符串的指針
字符串的指針就是字符串在內(nèi)存存儲(chǔ)區(qū)域中的起始地址,存放該字符串的字符數(shù)組名就是其指針。例如:定義一字符串:chars[]="IloveChina.";
那么,字符數(shù)組名s就是該字符串的指針。通過指針變量,既可以訪問整個(gè)字符串,也可以訪問字符串中的某個(gè)字符。【例7-14】通過字符數(shù)組名和指針變量訪問字符串。#include<stdio.h>voidmain(){chars[]="IloveChina.",*p;inti;for(i=0;s[i]!=’\0’;i++)printf("%c",s[i]);printf("\n");puts(s);
for(p=s;*p!=’\0’;p++)printf("%c",*p);printf("\n")p=s;puts(p);}使字符指針變量p重新指向字符串s的首地址
【例7-14-1】通過字符數(shù)組名和指針變量訪問字符串。#include<stdio.h>
voidmain(){char*p="IloveChina.",*p1=p;inti;for(i=0;*(p+i)!=’\0’;i++)printf("%c",*(p+i));printf("\n");puts(p);for(p=p1;*p!=’\0’;p++)printf("%c",*p);printf("\n");p=p1;puts(p);}直接使用字符型指針變量p指向字符串的首地址【例7-15】通過函數(shù)調(diào)用,將字符串1中從第m個(gè)字符開始的全部字符復(fù)制成字符串2。要求在主函數(shù)中輸入字符串1和m的值,并輸出復(fù)制結(jié)果。
#include<stdio.h>#include<string.h>voidcopys(char*,char*,int);main(){intm;chars1[80],s2[80];printf(“Pleaseinputastring:\n”);gets(s1);printf(“pleaseinputanintegerm:\n”);scanf(“%d”,&m);if(strlen(s1)<m)printf(“Errorm!\n”);else{copys(s1,s2,m);printf(“Resultis:%s\n”,s2);}}(后續(xù))
voidcopys(char*p1,char*p2,inti){intn=0;while(n<i-1){p1++;n++;}while(*p1!=’\0’){*p2=*p1;p1++;p2++;}*p2=’\0’;}(接前)四、指針數(shù)組一個(gè)數(shù)組,如果其元素均為指針變量,則稱之為指針數(shù)組。指針數(shù)組的定義格式:類型說明符*數(shù)組名[數(shù)組長(zhǎng)度];
說明:格式中的類型說明符是指針數(shù)組中的指針變量所指向的數(shù)據(jù)類型。
例如,語句:int*p[4];
定義了一個(gè)有四個(gè)元素組成的數(shù)組p,每一個(gè)元素p[i],(i=0,1,2,3)都是指向整型數(shù)據(jù)的指針變量。【例7-16】將若干字符串按字母順序(由小到大)輸出。
#defineN4#include<string.h>voidsort(char*s[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(strcmp(s[k],s[j])>0)k=j;if(k!=i){temp=s[i];s[i]=s[k];s[k]=temp;}}}(后續(xù))形參為指針數(shù)組s[k],s[j]為指針變量
voidout(char*s[],intn){inti;for(i=0;i<n;i++)printf("%s\n",s[i]);}mainO{char*str[N]={"CHINA","FRANCE","RUSSIA","AMERICA"};sort(str,N);out(str,N);}(接前)實(shí)參為指針數(shù)組名初始化時(shí)指針數(shù)組中的指針變量依次指向每一個(gè)字符串
調(diào)用sort()函數(shù)前調(diào)用sort()函數(shù)后
str[0]"CHINA"str[0]"CHINA"
str[1]"FRANCE"str[1]"FRANCE"str[2]"RUSSIA"str[2]"RUSSIA"
str[3]"AMERICA"str[3]"AMERICA"字符串排序前后指針數(shù)組元素的指向
7.4指針與函數(shù)一、指向函數(shù)的指針在C程序中定義的函數(shù),系統(tǒng)編譯時(shí)會(huì)為函數(shù)代碼分配一段連續(xù)的存儲(chǔ)空間,這段存儲(chǔ)空間的起始地址(又稱入口地址)稱為這個(gè)函數(shù)的指針。而函數(shù)名就代表該函數(shù)所占存儲(chǔ)空間的首地址??梢园押瘮?shù)的首地址賦給一個(gè)指向該函數(shù)的指針變量,通過該指針變量就可以調(diào)用這個(gè)函數(shù)。把這種指向函數(shù)的指針變量稱為“函數(shù)指針變量”。函數(shù)指針變量定義的格式為:
類型說明符(*指針變量名)(形式參數(shù)表列);【例7-17】用函數(shù)指針變量調(diào)用函數(shù)。#include<stdio.h>
intmax(intx,inty)
{
returnx
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年醫(yī)生臨床技能實(shí)操模擬測(cè)試
- 2026年電子工程電子元器件損壞分析測(cè)試題
- 2026年河南醫(yī)學(xué)高等??茖W(xué)校單招職業(yè)傾向性測(cè)試題庫必考題
- 2026年高級(jí)英語口語實(shí)戰(zhàn)題庫
- 2026年一級(jí)建筑師職業(yè)資格考試案例分析題庫
- 2026年建筑師面試設(shè)計(jì)理念與金句表達(dá)
- 2026年初級(jí)公共項(xiàng)目管理員能力測(cè)試題基礎(chǔ)知識(shí)與實(shí)務(wù)操作
- 2026年雅思考試詞匯與語法練習(xí)題集
- 2026年商業(yè)案例分析與實(shí)戰(zhàn)演練題集
- 2026年經(jīng)濟(jì)學(xué)基礎(chǔ)知識(shí)解析宏觀與微觀經(jīng)濟(jì)理解題庫
- 建筑總承包戰(zhàn)略合作協(xié)議書標(biāo)準(zhǔn)范本
- 2025江蘇蘇州高新區(qū)獅山商務(wù)創(chuàng)新區(qū)下屬國(guó)有企業(yè)招聘9人筆試題庫及答案詳解
- xx市燃?xì)飧脑祉?xiàng)目可行性研究報(bào)告
- 2025年無人駕駛公共交通產(chǎn)品競(jìng)爭(zhēng)力分析可行性報(bào)告
- 2025年秋季青島版三年級(jí)數(shù)學(xué)上冊(cè)求比一個(gè)數(shù)的幾倍多(少)幾的數(shù)教學(xué)課件
- 2025年職業(yè)技能鑒定-冷作工-冷作工職業(yè)技能監(jiān)定(中級(jí))歷年參考題庫含答案解析(5套)
- 專修室設(shè)備采購方案(3篇)
- 新生兒查體步驟及內(nèi)容
- 腺樣體個(gè)案護(hù)理
- 2025至2030鸚鵡馴養(yǎng)繁殖行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及競(jìng)爭(zhēng)格局與投資價(jià)值報(bào)告
- 湖北煙草專賣局考試題庫2024
評(píng)論
0/150
提交評(píng)論