版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第9章指針9.1指針和指針變量的概念9.2指針變量的定義與應用9.3數組的指針和指向數組的指針變量9.4字符串的指針和指向字符串的指針變量9.5返回指針值的函數9.6指針數組與主函數main()的形參9.7函數的指針和指向函數的指針變量9.1指針和指針變量的概念為了形象地描述內存單元的數據在存取過程中單元地址的變化情況,引入了指針這一概念。其實,指針就是地址。一般地,如果在程序中定義了一個變量,則編譯時系統(tǒng)會根據變量的類型給變量分配一定長度的字節(jié)數。實際上,內存中每個字節(jié)都有一個編碼,這個編碼就是該字節(jié)的地址。假設程序已定義了二個整型變量i、j;二個實型變量a、b;二個字符型變量c1、c2,編譯分配如圖9-1所示返回9.2指針變量的定義與應用9.2.1指針變量的定義與相關運算1.指針變量的定義指針變量的定義其實就是把存放地址的變量定義成“指針類型”。一般格式為:類型名*指針變量名;2.指針變量的相關運算(1)指針運算符有兩個相關的運算符:
&:取地址運算符。*:指針運算符(或稱“間接訪問”運算符)。下一頁返回9.2指針變量的定義與應用1)可用運算符&求變量的地址用賦值語句使指針變量指向變量,例如:p1=&i;(表示將變量i的地址賦給指針變量)p2=&j;(表示將變量j的地址賦給指針變量)則p1、p2分別指向了變量i、j。如圖9-2所示。2)可用運算符“*”引用指針變量“*”運算符用于某個地址(如指針變量)之前,表示取*后地址中的內容。上一頁下一頁返回9.2指針變量的定義與應用(2)指針的賦值與比較例9.1main(){int
a,b;
int*p1,*p2;a=10;b=20;p1=&a;p2=&b;
printf(“%d%d\n”,*p1,*p2);p1=p2;*p2=5;
printf(“%d%d\n”,*p1,*p2);}上一頁下一頁返回9.2指針變量的定義與應用(3)指針的算術運算1)指針可以與整型數相加減若指針變量p當前指向2000單元,其基類型是整型,則以下操作是合法的。
p=p+1/*p指向2002單元*/p=p+2;/*p指向2006單元*/p=p-1;/*p指向2004單元*/2)指針的減法運算兩個相同基類型的指針變量可以進行減法運算。設p1、p2均為指向整型變量的指針變量,且p1=2000,p2=2006,則p2-p1=3。3其實是(2006-2000)/2得到的結果,表示兩個指針所指對象之間指針基類型的元素個數。系統(tǒng)會根據類型自動地進行地址運算,并不是兩個地址的直接相減。上一頁下一頁返回9.2指針變量的定義與應用9.2.2指針變量作函數參數函數的參數是一般變量或常數時,函數實參向形參是單向值傳遞。函數的參數是數組名時,則將實參數組名傳遞給形參數組名,數組名表示數組中第一個元素的地址,故這種傳遞是地址傳遞。函數參數還可以是指針變量,其作用是將變量的地址傳到另一函數中去。下面用指針變量作為函數參數來實現兩個整數按由大到小的順序輸出。上一頁返回9.3數組的指針和指向數組的指針變量9.3.1概述
C語言中數組與指針有著密切的聯系,在編程時完全可以用指針代替下標引用數組及數組元素,且使數組的引用更為靈活、有效。當一個數組被定義后,程序會按照其類型和長度在內存中為數組分配一塊連續(xù)的存儲單元。此時,數組名成為符號常量,其值為數組在內存中所占用單元的首地址,也就是說數組名代表數組的首地址。指針是用來存放地址的變量,當某個指針存放數組名或數組中第一個元素的地址時,可以說該指針指向了這個數組,這樣我們可以通過指針間接訪問數組中的元素。下一頁返回9.3數組的指針和指向數組的指針變量9.3.2通過指針引用數組元素通過指針引用數組元素,必須要定義指向數組的指針,例如:
inta[10];
int*p;p=a;
以上語句定義了一個長度為10的一維整型數組,同時還定義了一個指針變量p,其基類型必須和所指向的數組類型相同,數組名a代表數組的首地址。由于數組的首地址就是數組元素a[0]的地址,故語句p=a;還可以是p=&a[0];,從而使p指向數組a的第0個元素。變量在定義的同時可以賦初值,上面三個語句還可以等價寫成:
inta[10],*p=a;或inta[10],*p=&a(0);只要移動指針p,就可訪問數組a的任一元素。如圖9-8所示。上一頁下一頁返回9.3數組的指針和指向數組的指針變量9.3.3數組名作為函數的參數數組名可以作為函數的形參或實參。如果要將一個一維數組的首地址傳給函數,實參可以是數組名或存放有數組首地址的指針變量。而形參可以為一個一維數組或基類型為數組元素的指針變量。例9.6編一個函數,求數組a中n個整數的最小值。方法1:形參為數組名,實參為指針。上一頁下一頁返回9.3數組的指針和指向數組的指針變量int
fmin(int*p,intn){int
i,m;m=*p;
for(i=0;i<n;i++)if(m>*(p+i))m=*(p+i);
return(m);}main(){
inta[10],min,i;
for(i=0;i<n;i++)
scanf(“%d”,&a[i]);min=fmin(a,10);
printf(“min=%d”,min);}上一頁下一頁返回9.3數組的指針和指向數組的指針變量該程序在進行函數調用時,將實參a的值(即數組的起始地址)傳給形參p,指針p獲得了數組的起始地址,通過指針的移動求出數組中元素的最小值。如圖9-10所示。上一頁下一頁返回9.3數組的指針和指向數組的指針變量方法2:實參和形參均為指向數組元素基類型的指針變量。int
fmin(int*p,intn){int
i,m;m=*p;
for(i=0;i<n;i++)if(m>*(p+i))m=*(p+i);
return(m);}上一頁下一頁返回9.3數組的指針和指向數組的指針變量main(){inta[10],i,*p1,min;
for(i=0;i<n;i++)
scanf(“%d”,&a[i]);p1=a;min=fmin(p1,10);
printf(“min=%d”,min);}上一頁下一頁返回9.3數組的指針和指向數組的指針變量方法3:實參和形參都是數組名。int
fmin(int
b[],intn){int
i,m;m=b[0];
for(i=0;i<n;i++)if(m>b[i])m=b[i];
return(m);}上一頁下一頁返回9.3數組的指針和指向數組的指針變量main(){inta[10],min,i;
for(i=0;i<n;i++)
scanf(“%d”,&a[i]);min=fmin(a,10);
printf(“min=%d”,min);}上一頁下一頁返回9.3數組的指針和指向數組的指針變量方法4:實參為指向數組的指針變量,形參為數組。int
fmin(int
b[],intn){int
i,m;m=b[0];
for(i=0;i<n;i++)if(m>b[i])m=b[i];
return(m);}
上一頁下一頁返回9.3數組的指針和指向數組的指針變量main(){inta[10],i,*p1,min;
for(i=0;i<n;i++)
scanf(“%d”,&a[i]);p1=a;min=fmin(p1,10);
printf(“min=%d”,min);}上一頁下一頁返回9.3數組的指針和指向數組的指針變量說明:接受數組首地址的形參不論定義為數組形式還是定義為指針,C編譯時都會把它轉化為指針處理。因為參數不能接受整個數組,只能得到數組的起始地址。因此,形參中的數組名是指針變量而不是指針常量,這樣就可以對作為形參的數組名進行各種運算,如自加或自減。但作為主函數中定義的數組名是常量,是不可以進行自加或自減的。上一頁下一頁返回9.3數組的指針和指向數組的指針變量9.3.4二維數組的指針及其指針變量用指針變量可以指向一維數組,并可通過指針引用數組元素。指針變量也可以指向二維數組,在概念和使用上,二維數組的指針較一維數組的指針要復雜一些。1.二維數組的地址表示法二維數組從其表面上看既有行又有列,因此它的邏輯結構是二維結構。實際上,二維數組在內存中是以行的形式存放的,也就是說,它的物理結構是一維的。下面舉例說明二維數組的地址及元素的關系和表示方法。上一頁下一頁返回9.3數組的指針和指向數組的指針變量設二維數組為:inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};則數組名為a,它有3行4列共計12個元素。0行:a[0][0]a[0][1]a[0][2]a[0][3]1行:a[1][0]a[1][1]a[1][2]a[1][3]2行:a[2][0]a[2][1]a[2][2]a[2][3]經初始化后,如圖9-11所示。上一頁下一頁返回9.3數組的指針和指向數組的指針變量2.指向二維數組的指針變量在了解了上面的概念后,可以用指針變量指向二維數組及其元素。(1)指向數組元素的指針變量例9.7用指針變量輸出數組元素的值。main(){
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int*p,i=0;
for(p=a[0];p<a[0]+12;p++,i++)/*m*/{if(i%4==0)printf(“\n”);printf(“%5d”,*p);}}上一頁下一頁返回9.3數組的指針和指向數組的指針變量(2)指向數組的指針變量對于二維數組元素的訪問,還可以定義一個指向一維數組的指針,并將一個行地址送給它。這時指針值加1,則該指針移動的長度為一維數組的長度。指向一維數組的指針的定義方法如下:類型說明符(*指針變量名)[數組長度];
其中,類型說明符為數組元素的類型,數組長度確定了指針變量在進行加1或減1時移動的元素個數。上一頁返回9.4字符串的指針和指向字符串的指針變量9.4.1字符串的表示和引用
C語言中沒有專門存放字符串的變量,字符串是存放在字符數組中,且以‘\0’作為結束標志,數組名表示該字符串在內存中的首地址。當定義一個指針變量指向一字符數組后,就可以通過指針訪問數組中的每個元素。因此,可以用兩種方法訪問一個字符串。下一頁返回9.4字符串的指針和指向字符串的指針變量1.用字符數組處理字符串例9.9main(){inti;charstr[]=“Iamastudent.”;
printf(“%s\n”,str);
for(i=0;str[i]!=’\0’;i++)
print(“%c”,str[i]);
printf(“\n”);printf(“%s”,&str[7]);}上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量2.用字符指針實現上述結果例9.10main(){char*str=“Iamastudent.”,*str1;str1=str;
printf(“%s\n”,str);for(;*str!=’\0’;str++)
print(“%c”,*str);
printf(“\n”);str1=str1+7;printf(“%s”,str1);}上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量9.4.2字符串指針作函數參數將一個字符串從一個函數傳遞到另一個函數,可以用字符數組作參數,也可以用指向字符串的指針變量作參數,即都是用地址傳遞的辦法。若在被調用的函數中改變字符串的內容,則在主調函數中可以得到改變了的字符串。上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量例9.13編一函數實現字符串的復制方法一:實參和形參都為字符數組voidstr_copy(charstr1[],charstr2[]){inti=0;while(str1[i]!=’\0’){str2[i]=str1[i];i++;}str2[i]=’\0’;}上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量main(){chara[]=“Iamastudent.”;charb[]=“Youareateacher.”;
printf(“string_a=%s\nstring_b=%s\n”,a,b);
str_copy(a,b);
printf(“\nstring_a=%s\nstring_b=%s\n”,a,b)}上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量方法二:實參為字符型指針變量,形參為字符數組str_copy函數同上,main函數可改寫如下:main(){char*a=“Iamastudent.”;char*b=“Youareateacher.”;
printf(“string_a=%s\nstring_b=%s\n”,a,b);
str_copy(a,b);
printf(“\nstring_a=%s\nstring_b=%s\n”,a,b)}上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量方法三:形參為字符型指針變量,實參為字符數組str_copy函數可改為:voidstr_copy(char*str1,char*str2){while(*str1!=’\0’){*str2=*str1;str1++;str2++;}*str2=’\0’;}main函數同方法一。上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量方法四:形參和實參都用字符指針變量voidstr_copy(char*str1,char*str2){while(*str1!=’\0’){*str2=*str1;str1++;str2++;}*str2=’\0’;}上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量main(){char*a=“Iamastudent.”;char*b=“Youareateacher.”;
printf(“string_a=%s\nstring_b=%s\n”,a,b);
str_copy(a,b);
printf(“\nstring_a=%s\nstring_b=%s\n”,a,b)}上一頁下一頁返回9.4字符串的指針和指向字符串的指針變量說明:(1)實參和形參無論是數組還是指針變量,在參數傳遞過程中傳遞的都是地址。(2)字符數組由若干個元素組成,每個元素中放一個字符,而字符指針變量中存放的是地址(字符串的首地址),決不是將字符串放到字符指針變量中。(3)字符串的復制是將原字符串的內容依次復制到目標字符串中去,直到遇到字符串結束標志(’\0’)。上一頁返回9.5返回指針值的函數一個函數可以帶回一個整型值、實型值、字符型值等,也可以帶回指針型的數據,即地址。帶回指針值的函數的定義方法如下:類型名*函數名(參數表);例9.14輸入兩個字符串(長度不超過80),進行字符串比較,并輸出較大的字符串。用指針函數實現。#include<string.h>#defineSTRLEN81#include<stdio.h>char*maxstr(char*str1,char*str2){if(strcmp(str1,str2)>=0)return(str1);elsereturn(str2);}下一頁返回9.5返回指針值的函數main(){charstring1[STRLEN],string2[STRLEN],*result;
printf(“Inputtwostrings:\n”);scanf(“%s%s”,string1,string2);result=maxstr(string1,string2);
printf(“Themaxstringis:%s\n”,result);}上一頁返回9.6指針數組與主函數main()的形參9.6.1指針數組一個數組,其元素均為指針類型數據,稱其為指針數組。定義形式如下:類型名*數組名[數組長度];例如:int*a[10];
說明:
a是一個指針數組,有10個元素,每個元素的類型為指針,指向數據的類型為整型。下一頁返回9.6指針數組與主函數main()的形參9.6.2主函數main()的形參指針數組的一個重要應用是作為main函數的形參。到目前為止,我們所編寫的main()函數都不帶參數,事實上main()函數是可以帶參數的。如果main()函數帶形參的話,由于它不能被其他函數調用,那么其參數是由誰提供的呢?顯然不可能從程序中得到。只有系統(tǒng)調用main()函數時,才能提供實參,實際上實參是由命令行提供的。那么什么是命令行呢?命令行的一般形式為:可執(zhí)行文件名參數1參數2…參數n上一頁下一頁返回9.6指針數組與主函數main()的形參說明:命令行中包括命令名和需要傳給main()函數的參
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026陜西西安交通大學科技與教育發(fā)展研究院科研人員招聘1人考試參考題庫及答案解析
- 2026新疆天恒基建工集團有限公司面向社會選聘管理人員2人參考考試題庫及答案解析
- 2026中國科學院生物物理研究所生物成像中心工程師助理招聘2人備考考試題庫及答案解析
- 2026廣東警官學院保衛(wèi)工作部校衛(wèi)隊隊員招聘備考考試題庫及答案解析
- 2026云南臨滄市臨翔區(qū)博尚鎮(zhèn)城鎮(zhèn)公益性崗位人員招聘2人備考考試試題及答案解析
- 2026年漢中市中醫(yī)醫(yī)院招聘(9人)備考考試題庫及答案解析
- 2026江蘇蘇州市五二六廠技工學校教師招聘10人備考考試試題及答案解析
- 前列腺增生護理中的疼痛管理策略
- 2026年廣西市區(qū)直事業(yè)單位招聘(650人)備考考試試題及答案解析
- 2026山東臨沂沂河新區(qū)部分事業(yè)單位招聘綜合類崗位工作人員筆試備考題庫及答案解析
- Roland羅蘭樂器AerophoneAE-20電吹管ChineseAerophoneAE-20OwnersManual用戶手冊
- 2025年保安員資格考試題目及答案(共100題)
- 2024年中國螢石礦行業(yè)調查報告
- 黨群工作部室部管理制度
- 2025至2030年中國兔子養(yǎng)殖行業(yè)市場現狀調查及投資方向研究報告
- 委外施工安全試題及答案
- DBT29-320-2025 天津市建筑工程消能減震隔震技術規(guī)程
- 產品技術維護與保養(yǎng)手冊
- 2024年國家電網招聘之電工類考試題庫(突破訓練)
- 中建公司建筑機電設備安裝工程標準化施工手冊
- 心臟科醫(yī)生在心血管疾病治療及介入手術方面的總結
評論
0/150
提交評論