版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第7章指針學(xué)習(xí)目標(biāo)掌握定義指針的方法,掌握指針的基本操作;掌握利用指針作為函數(shù)參數(shù)傳遞數(shù)據(jù)的方法;掌握一維數(shù)組指針和行指針的概念和應(yīng)用主要內(nèi)容指針的概念指針變量的定義指針的基本操作指針變量的簡單應(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ù)組的存儲地址2000H。顯然,數(shù)組元素arr[0]的指針也是2000H,數(shù)組元素arr[1]的指針是2002H,……。在C程序中,執(zhí)行語句:printf("%x",arr);
即可輸出一維數(shù)組arr的指針。一維數(shù)組指針和數(shù)組元素指針的關(guān)系
數(shù)組名+i指向數(shù)組第i個元素例如:arr是數(shù)組arr[]的指針,則
arr+i指向數(shù)組arr[]的第i個元素,即:
arr+i=&arr[i]【例7-6】從鍵盤輸入10個整數(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).指針變量可以施行自加、自減運算,p++或++p使指針變量指向數(shù)組當(dāng)前元素的下一個元素,而p--或--p使指針變量指向數(shù)組當(dāng)前元素的前一個元素。(2).數(shù)組名a是數(shù)組的首地址,是一個常量,所以不可以施行自加、自減運算。(3).如果指針變量p指向數(shù)組的某一個元素a[i],則*p++表示讀取a[i]的值后,再使p指向a[i+1]。可以類似地理解*p--。(4).如果指針變量p指向數(shù)組的某一個元素a[i],則--*p表示先使p指向a[i-1],再讀取a[i-1]的值??梢灶愃频乩斫?+*p。(5).如果指針變量p指向數(shù)組的某一個元素a[i],則(*p)++表示讀取a[i]的值后,執(zhí)行a[i]+=1,而p的指向不變。可以類似地理解(*p)--。
(6).*p++和*(p++)、*p--和*(p--)的運算結(jié)果是一樣的。【例7-7】從鍵盤輸入5個數(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ù)組的指針1.行指針的概念
二維數(shù)組的數(shù)組名表示數(shù)組存儲的首地址。例如,定義二維數(shù)組:inta[3][4]={{2,4,6,8},{10,12,14,16},{18,28,22,24}};設(shè)數(shù)組a存儲在從2000H開始的存儲單元中。(圖中假設(shè)int占2字節(jié))
數(shù)組名a指向數(shù)組存儲的首地址2000H。但a+1不是指向a[0][1]的存儲單元,而是指向二維數(shù)組第1行的存儲首地址2008H,a+2指向二維數(shù)組第2行的存儲首地址2010H..….。確切地說,數(shù)組名a指向二維數(shù)組第0行的存儲首地址2000H。注意:
稱二維數(shù)組各行的存儲首地址為該行的行指針,是以二維數(shù)組的行為存儲單位的地址。二維數(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ù)組的列元素個數(shù)];對二維數(shù)組a[3][4],定義行指針變量:int(*p)[4];
其中:(*p)表示p是行指針變量,[4]表示該行指針變量指向的行有4個列元素,int表示二維數(shù)組的元素為整型變量?!纠?-8】以二種不同的方式輸出數(shù)組元素a[i][j]的存儲單元地址和值。#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對行指針變量p作初始化行指針的方法輸出數(shù)組元素a[i][j]的指針和值
用二維數(shù)組名的方法輸出數(shù)組元素a[i][j]的指針和值【例7-9】用行指針的方法計算并輸出二維數(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]的地址對指針變量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ù)組名
三、字符串的指針
字符串的指針就是字符串在內(nèi)存存儲區(qū)域中的起始地址,存放該字符串的字符數(shù)組名就是其指針。例如:定義一字符串:chars[]="IloveChina.";
那么,字符數(shù)組名s就是該字符串的指針。通過指針變量,既可以訪問整個字符串,也可以訪問字符串中的某個字符。【例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個字符開始的全部字符復(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ù)組一個數(shù)組,如果其元素均為指針變量,則稱之為指針數(shù)組。指針數(shù)組的定義格式:類型說明符*數(shù)組名[數(shù)組長度];
說明:格式中的類型說明符是指針數(shù)組中的指針變量所指向的數(shù)據(jù)類型。
例如,語句:int*p[4];
定義了一個有四個元素組成的數(shù)組p,每一個元素p[i],(i=0,1,2,3)都是指向整型數(shù)據(jù)的指針變量?!纠?-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ù)組中的指針變量依次指向每一個字符串
調(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ù)代碼分配一段連續(xù)的存儲空間,這段存儲空間的起始地址(又稱入口地址)稱為這個函數(shù)的指針。而函數(shù)名就代表該函數(shù)所占存儲空間的首地址。可以把函數(shù)的首地址賦給一個指向該函數(shù)的指針變量,通過該指針變量就可以調(diào)用這個函數(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等.壓縮文件請下載最新的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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《深圳大學(xué)圖書館》課件
- 《電子服務(wù)概論》課件
- 2024屆安徽省部分學(xué)校高三上學(xué)期期末考試歷史試題(解析版)
- 2024年遼寧輕工職業(yè)學(xué)院單招職業(yè)技能測試題庫完整答案
- 單位管理制度集粹選集【人事管理篇】十篇
- 單位管理制度匯編大全【員工管理篇】
- 單位管理制度合并選集職工管理篇
- 《法國雪鐵龍公園》課件
- 單位管理制度分享合集【職工管理篇】
- 單位管理制度呈現(xiàn)大全【職工管理】十篇
- 預(yù)約診療工作自查自糾報告
- 行業(yè)會計比較ppt課件(完整版)
- 新修訂《數(shù)據(jù)安全法》全文ppt
- 各項常規(guī)檢查前后的注意事項課件
- 2021年推進(jìn)婦幼健康領(lǐng)域中醫(yī)藥工作總結(jié)
- 綠化苗木組織供應(yīng)及售后服務(wù)方案
- YY∕T 0314-2021 一次性使用人體靜脈血樣采集容器
- 第五章_油樣分析
- 儲罐受限空間作業(yè)方案DOC
- 壓力容器耐壓試驗
- 課程設(shè)計---年產(chǎn)5.6萬噸乙醇精餾塔的設(shè)計
評論
0/150
提交評論