版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十章
指針
1本章知識(shí)點(diǎn):本章知識(shí)點(diǎn):一維數(shù)組的指針二維數(shù)組的指針指針數(shù)組指向指針的指針函數(shù)指針指針函數(shù)單鏈表的使用210.1數(shù)組、地址與指針
10.1.1數(shù)組、地址與指針的關(guān)系在前面我們?cè)岬竭^(guò),數(shù)組名可以代表數(shù)組的首地址。因此,下面的兩種表示是等價(jià)的:
a,&a[0]即數(shù)組的首地址也就是數(shù)組中第1個(gè)元素的地址。由于在內(nèi)存中數(shù)組中的所有元素都是連續(xù)排列的,即數(shù)組元素的地址是連續(xù)遞增的,所以通過(guò)數(shù)組的首地址加上偏移量就可得到其它元素的地址。【例10.1】輸出數(shù)組中的元素。10.1.2一維數(shù)組中的地址與指針數(shù)組元素的訪問(wèn)主要有三種形式下標(biāo)法、地址法和指針?lè)ā?/p>
下標(biāo)法:即以a[i]的形式存取數(shù)組元素。
地址法:用*(a+i)的形式存取數(shù)組元素,這種方法和下標(biāo)法實(shí)質(zhì)上是一樣的。
指針?lè)ǎ河靡粋€(gè)指針指向數(shù)組的首地址,然后通過(guò)移動(dòng)指針訪問(wèn)數(shù)組元素。4【例10.2】設(shè)一數(shù)組有10個(gè)元素,要求輸出所有數(shù)組元素的值。5方法一:通過(guò)下標(biāo)法存取數(shù)組元素,程序如下:#include<stdio.h>intmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i<10;i++) printf("%d",a[i]);/*通過(guò)數(shù)組下標(biāo)訪問(wèn)數(shù)組元素*/printf("\n");return0;}
6方法2:通過(guò)數(shù)組名計(jì)算數(shù)組元素的地址存取數(shù)組元素#include<stdio.h>intmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i<10;i++) printf("%d",*(a+i));/*數(shù)組名a表示數(shù)組的首地址*/printf("\n");return0;}
7方法3:通過(guò)指針變量存取數(shù)組元素#include<stdio.h>intmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti,*p;for(p=a;p<(a+10);p++) printf("%d",*p);/*通過(guò)指向數(shù)組元素的指針訪問(wèn)數(shù)組元素*/printf("\n");return0;}
10.1.3二維數(shù)組中的地址與指針在C語(yǔ)言中,二維數(shù)組是按行優(yōu)先的規(guī)律轉(zhuǎn)換為一維線性存放在內(nèi)存中的,因此,可以通過(guò)指針訪問(wèn)二維數(shù)組中的元素。
例如:inta[M][N];
則將二維數(shù)組中的元素a[i][j]轉(zhuǎn)換為一維線性地址的一般公式是:
線性地址=a+i×M+j其中:a為數(shù)組的首地址,
M和N分別為二維數(shù)組行和列的元素個(gè)數(shù)。8【例10.3】給定某年某月某日,將其轉(zhuǎn)換成這一年的第幾天并輸出。問(wèn)題分析:此題的算法很簡(jiǎn)單,若給定的月是i,則將1、2、3、……、i-1月的各月天數(shù)累加,再加上指定的日。但對(duì)于閏年,二月的天數(shù)29天,因此還要判定給定的年是否為閏年。為實(shí)現(xiàn)這一算法,需設(shè)置一張每月天數(shù)列表,給出每個(gè)月的天數(shù),考慮閏年非閏年的情況,此表可設(shè)置成一個(gè)2行13列的二維數(shù)組,其中第1行對(duì)應(yīng)的每列(設(shè)1~12列有效)元素是平年各月的天數(shù),第2行對(duì)應(yīng)的是閏年每月的天數(shù)。程序中使用指針作為函數(shù)day_of_year的形式參數(shù)。910.2.1指針數(shù)組1、指針數(shù)組的定義指針數(shù)組是一種特殊的數(shù)組,指針數(shù)組的數(shù)組元素都是指針變量。指針數(shù)組的定義形式如下:
類型名稱*數(shù)組名稱[數(shù)組長(zhǎng)度];
例如:int*p[5];因?yàn)橄聵?biāo)運(yùn)算符[]的優(yōu)先級(jí)高于指針運(yùn)算符*,上述定義等價(jià)于:int*(p[5])說(shuō)明:(1)p是一個(gè)含有5個(gè)元素的數(shù)組,數(shù)組元素為指向int型變量。(2)指針數(shù)組的所有元素都必須是具有相同存儲(chǔ)類型和指向相同數(shù)據(jù)類型的指針變量。102、指針數(shù)組的使用指針數(shù)組最常用的是一維指針數(shù)組,常用于處理二維數(shù)組或多個(gè)字符串,尤其是字符串?dāng)?shù)組,(1)指針數(shù)組與二維數(shù)值數(shù)組例如下程序段:inta[3][4],*p[3];inti;...for(i=0;i<3;i++) p[i]=a[i];1112【例10.4】輸出一個(gè)N×N的矩陣,要求非對(duì)角線上的元素值為0,對(duì)角線元素值為1。問(wèn)題分析:(1)定義一個(gè)二維數(shù)組,存儲(chǔ)矩陣的各元素值;(2)定義指針數(shù)組,和二維數(shù)組的各行元素相關(guān)聯(lián);(3)通過(guò)指針數(shù)組訪問(wèn)二維數(shù)組各元素值;(4)先將所有元素置0,然后再將對(duì)角線上的元素置1。如果當(dāng)前元素的下標(biāo)滿足關(guān)系i==j或j==n-1-i時(shí),說(shuō)明此元素是主對(duì)角線獲次對(duì)角線上的元素,則置1?!纠?0.5】
輸入一個(gè)表示月份的整數(shù),輸出該月的名字?!纠?0.6】利用字符指針數(shù)組對(duì)字符串進(jìn)行按字典排序。10.2.2指向指針的指針指針變量也有地址,存放指針變量地址的指針變量稱為指向指針變量的指針或稱指針變量的指針、多級(jí)指針。指針變量的指針在說(shuō)明時(shí)變量前有兩個(gè)*號(hào)。例如
char**lineptr;說(shuō)明:lineptr是指向一個(gè)字符指針變量的指針,因?yàn)閱文窟\(yùn)算符*是自右向左結(jié)合的運(yùn)算符,
因而說(shuō)明符**lineptr應(yīng)說(shuō)明為:(*(*lineptr))?!纠?0.7】使用指向指針的指針輸出若干個(gè)字符串。13多級(jí)間址的對(duì)應(yīng)關(guān)系如圖10.5所示:14m的地址m的值指針變量p變量m(a)單級(jí)間址(b)二級(jí)間址(c)多級(jí)間址m的地址m的值指針變量p1變量mP1的地址指針變量p2m的地址m的值指針變量p1變量mP(n-1)的地址指針變量pnP1的地址指針變量p2…10.3指針數(shù)組作main函數(shù)的參數(shù)帶參數(shù)main函數(shù)的定義格式如下:intmain(intargc,char*argv[]){ …}argc和argv是main函數(shù)的形式參數(shù)。這兩個(gè)形式參數(shù)的類型是系統(tǒng)規(guī)定的。如果main函數(shù)要帶參數(shù),就是這兩個(gè)類型的參數(shù);否則main函數(shù)就沒有參數(shù)。變量名稱argc和argv是常規(guī)的名稱,當(dāng)然也可以換成其他名稱。15【例10.8】回顯命令行參數(shù)的程序。#include"stdio.h"intmain(intargc,char*argv[]){ inti; for(i=1;i<argc;i++) printf("%s%c",argv[i],(i<argc-1)?'':'\n'); return0;}1610.4指向函數(shù)的指針----函數(shù)指針通常,程序中的每一個(gè)函數(shù)經(jīng)編譯連接后,其目標(biāo)代碼在計(jì)算機(jī)內(nèi)存中是連續(xù)存放的,函數(shù)體內(nèi)第一個(gè)可執(zhí)行語(yǔ)句的代碼在內(nèi)存的地址就是函數(shù)執(zhí)行時(shí)的入口地址,一個(gè)函數(shù)的入口地址由函數(shù)名表示。C語(yǔ)言可以聲明指向函數(shù)的指針,指向函數(shù)的指針是存放函數(shù)入口地址的變量。把函數(shù)名賦給一個(gè)指向函數(shù)的指針,就可以用指向函數(shù)的指針來(lái)調(diào)用函數(shù)。
10.4指向函數(shù)的指針----函數(shù)指針假設(shè)有一個(gè)函數(shù)func,則其內(nèi)存映射方式如下圖所示:函數(shù)func所占內(nèi)存單元
指令1指令2指令3......指令n函數(shù)指針內(nèi)存示意圖func10.4指向函數(shù)的指針----函數(shù)指針函數(shù)指針的說(shuō)明形式:
[存儲(chǔ)類型區(qū)分符]類型區(qū)分符(*
標(biāo)識(shí)符)(參數(shù)表),…;標(biāo)識(shí)符是指向函數(shù)的指針名
“(*
標(biāo)識(shí)符)(參數(shù)表)”
是函數(shù)指針說(shuō)明符,例如
int(*comp)(char*,char*);說(shuō)明:comp是指向有兩個(gè)char*參數(shù)的整型類型函數(shù)的指針,與指向數(shù)組的指針說(shuō)明類似,說(shuō)明符中用于改變運(yùn)算順序的()不能省。10.4指向函數(shù)的指針----函數(shù)指針關(guān)于函數(shù)指針有幾點(diǎn)需要說(shuō)明:(1)指向函數(shù)的指針變量一般形式為數(shù)據(jù)類型(*指針變量名)();(2)函數(shù)的調(diào)用可以通過(guò)函數(shù)名調(diào)用,也可以通過(guò)函數(shù)指針調(diào)用。(3)如果定義了int(*p)(),則(*p)()表示定義一個(gè)指向整型函數(shù)的指針變量,但它不固定指向哪一個(gè)函數(shù),而只是表示定義了這樣一個(gè)類型的變量,是專門用來(lái)存放函數(shù)的入口地址的。(4)在給函數(shù)指針變量賦值時(shí),只需給出函數(shù)名而不必給出參數(shù)。(5)用函數(shù)指針變量調(diào)用函數(shù)時(shí),只需將(*p)代替函數(shù)名即可,在
(*p)之后的括弧中需要寫上實(shí)參。(6)對(duì)指向函數(shù)的指針變量,像p++、p--、p+n等運(yùn)算是無(wú)意義的。10.4指向函數(shù)的指針----函數(shù)指針函數(shù)指針主要應(yīng)用于將函數(shù)名傳給另一個(gè)函數(shù),C語(yǔ)言允許將函數(shù)的名字作為函數(shù)參數(shù)傳給其他函數(shù)。由于參數(shù)傳遞是傳值,相當(dāng)于將函數(shù)名賦給形參。因此在被調(diào)用函數(shù)中,接收函數(shù)名的形參是指向函數(shù)的指針。例(下頁(yè)):
10.4指向函數(shù)的指針----函數(shù)指針#include<stdio.h>floatadd(floatx,floaty){returnx+y;}intmain(){float(*p)(float,float);p=add;printf("2=3=%g\n",add(2,3));
printf("2=3=%g\n",p(2,3));printf("2=3=%g\n",(*p)(2,3));
return0;}程序運(yùn)行結(jié)果為:
2+3=52+3=52+3=510.4指向函數(shù)的指針----函數(shù)指針例10-9(P281)用函數(shù)指針數(shù)組來(lái)實(shí)現(xiàn)對(duì)一系列函數(shù)的調(diào)用。10.5指針作為函數(shù)的返回值---指針函數(shù)C的函數(shù)可以返回除數(shù)組和函數(shù)外的任何類型數(shù)據(jù)和指向任何類型的指針,如數(shù)組的指針,函數(shù)的指針,也可是void指針,返回指針的函數(shù)稱為指針函數(shù)。指針函數(shù)說(shuō)明的一般形式為[存儲(chǔ)類型區(qū)分符]類型區(qū)分符*函數(shù)名(參數(shù)表),…;其中“*函數(shù)名(參數(shù)表)”是指針函數(shù)說(shuō)明符,例如
int*a(int,int);說(shuō)明:a是一個(gè)整型指針函數(shù),它有兩個(gè)參數(shù),返回值是一個(gè)指向整型數(shù)據(jù)的指針。注意:不可以將int*a(int,int)寫成int(*a)(int,int)
二者說(shuō)明的對(duì)象是完全不同的兩個(gè)概念。后者表示a是一個(gè)指針變量。
10.5指針作為函數(shù)的返回值---指針函數(shù)例:寫一個(gè)指針函數(shù)strstr(s,t),在字符串s中查找子串t,如果找到,返回t在s中第一次出現(xiàn)的起始位置,否則返回0。
char*strstr(char*s,char*t){char*ps=s,*pt,*pc; while(*ps!='\0') {for(pt=t,pc=ps;(*pt!='\0')&&(*pt==*pc);pt++,pc++);if(*pt=='\0')returnps; ps++;}return0;}10.5指針作為函數(shù)的返回值---指針函數(shù)例10-11(P282)
輸入長(zhǎng)度不超過(guò)100個(gè)字符的一行正文和長(zhǎng)度不超過(guò)10個(gè)字符的一個(gè)字符串,在輸入行中查找字符串的第一次出現(xiàn),若找到則輸出這一行,否則輸出未找到的信息。10.5指針作為函數(shù)的返回值---指針函數(shù)注意:使用指針函數(shù)時(shí)要避免返回的指針?biāo)鶎?duì)應(yīng)的內(nèi)存空間因該指針函數(shù)的返回而被釋放掉。返回的指針通常有以下幾種:(1)函數(shù)中動(dòng)態(tài)分配的內(nèi)存(通過(guò)malloc等函數(shù)實(shí)現(xiàn))的首地址;(2)通過(guò)指針形參所獲得的實(shí)參的有效地址;(3)函數(shù)中的靜態(tài)變量或全局變量所對(duì)應(yīng)的存儲(chǔ)單元的首地址;
10.6鏈表1.鏈表的概念鏈表是一種常用的數(shù)據(jù)結(jié)構(gòu)。它是一種動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的數(shù)據(jù)結(jié)構(gòu)。它不同于數(shù)組,它不必事先確定好元素的個(gè)數(shù),它可以根據(jù)當(dāng)時(shí)的需要來(lái)開辟內(nèi)存單元,它的各個(gè)元素不要求順序存放,因此,它克服使用數(shù)組存放數(shù)據(jù)的一些不足。2.鏈表的實(shí)現(xiàn)鏈表是由若干個(gè)稱為結(jié)點(diǎn)的元素構(gòu)成的。每個(gè)結(jié)點(diǎn)包含有數(shù)據(jù)字段和鏈接字段。數(shù)字字段是用來(lái)存放結(jié)點(diǎn)的數(shù)據(jù)項(xiàng)的;鏈接字段是用來(lái)存放該結(jié)點(diǎn)指向另一結(jié)點(diǎn)的指針的。每個(gè)鏈表都有一個(gè)“頭指針”,它是存放該鏈表的起始地址,即指向該鏈表的起始結(jié)點(diǎn),它是識(shí)別鏈表的標(biāo)志,對(duì)某個(gè)鏈表進(jìn)行操作,首先要知道該鏈表的頭指針。鏈表的最后一個(gè)結(jié)點(diǎn),稱為“表尾”,它不再指向任何后繼結(jié)點(diǎn),表示鏈表的結(jié)束,該結(jié)點(diǎn)中鏈接字段指向后繼結(jié)點(diǎn)的指針存放NULL。單向鏈表單向鏈表僅有一個(gè)指向后繼結(jié)點(diǎn)的指針雙向鏈表單向鏈表僅有一個(gè)指向后繼結(jié)點(diǎn)的指針鏈表的分類單向鏈表的操作(1)鏈表的建立(2)鏈表的輸出(3)鏈表的刪除(4)鏈表的插入(5)鏈表的存儲(chǔ)(6)鏈表的裝入使用一個(gè)學(xué)生成績(jī)表,該表是由若干個(gè)學(xué)生的成績(jī)組成,每個(gè)結(jié)點(diǎn)是一個(gè)學(xué)生的成績(jī)。建立鏈表函數(shù)的算法如下:stuctstudent{char*namelongnum;intscorestructstudent*next;}建立鏈表函數(shù)內(nèi)容如下:structstudent*creatlist(){structstudent*head,*p,*q;head=NULL;p=q=(structstudent*)malloc(sizeof(student));n=o;printf("Inputnodedata:");scanf("%d%s%d",&p->num,p->name,&p->score);while(p->num!=0){n++if(n==1){head=phead->next=NULL}elseq->next=pq=pp=(structstudent*)malloc(sizeof(structstudent));printf("Inputnodedata:")scanf("%1d%s%d",&p->num.p->name,&p->score);}q->next=NULLreturn(head);}鏈表輸出函數(shù)鏈表輸出函數(shù)算法如下:首先要知道輸出鏈表的頭指針。假定一個(gè)指向鏈表結(jié)點(diǎn)個(gè)數(shù)的結(jié)構(gòu)指針P,使它指向鏈表的第一個(gè)結(jié)點(diǎn),即將頭指針賦給它。輸出P所指結(jié)點(diǎn)的數(shù)據(jù)內(nèi)容。再使P后移一個(gè)結(jié)點(diǎn),輸出該結(jié)點(diǎn)數(shù)據(jù),直到鏈表的最后一個(gè)結(jié)點(diǎn)為止。鏈表輸出函數(shù)內(nèi)容voidprintlist(head)structstudent*head{structstudent*pprintf("\nNow,there%dnodedataare:\n",n)p=head;if(head!=NULL)do{printf("%ld,%s,%d\n",p->num,p->name,p->score);p=p=>next;}while(p!=NULL);elseprintf("Thereareaemptylist!\n");}應(yīng)用程序舉例:例
已有定義inta[10]={2,4,6,8,10,12,14,16,18},要求通過(guò)指針完成在數(shù)組a中插入一個(gè)x,使插入后仍然有序。程序分析:在main()函數(shù)中定義數(shù)組時(shí),要多開辟一個(gè)用于存放插入數(shù)據(jù)的存儲(chǔ)單元。如例中定義含10個(gè)整型元素的一維數(shù)組a并初始化。在用戶自定義函數(shù)sort()中,定義一個(gè)基類型為int的指針變量p,并將數(shù)組a的首地址賦給指針p。為了將x插入到數(shù)組中,應(yīng)從有序數(shù)組中找到插入的位置,然后將該位置起以后的所有元素依次后移,將插入位置騰出來(lái)。最后把x插入到插入的位置。源程序:#include"stdio.h"voidsort(int*p,intn,intx){ inti,j; for(i=0;i<n;i++) if(*(p+i)>x)break
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年管涵施工與建筑廢棄物處理合同3篇
- 二零二五年度集裝箱購(gòu)置與綠色港口運(yùn)營(yíng)合同3篇
- 二零二五年度集資房項(xiàng)目審計(jì)與財(cái)務(wù)報(bào)表編制合同3篇
- 2024年海南經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 二零二五年戶外廣告安裝工程量清單及結(jié)算合同3篇
- 吉林省農(nóng)安縣九年級(jí)物理全冊(cè)182電功率課件新版新人教版
- 2024年河南質(zhì)量工程職業(yè)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 2024年河南工業(yè)和信息化職業(yè)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 2024年河北政法職業(yè)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 《陋室銘》(過(guò)關(guān)檢測(cè))(原卷版)-2024年中考語(yǔ)文課內(nèi)39篇文言文閱讀
- 福建省福州市2023-2024學(xué)年高一上學(xué)期期末考試物理試卷 附答案
- 2024-2030年中國(guó)IT運(yùn)營(yíng)管理(ITOM)軟件行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 圍欄護(hù)欄施工合同協(xié)議書
- 2021版血液凈化標(biāo)準(zhǔn)操作規(guī)程考核試題及答案
- 第5課《弘揚(yáng)勞動(dòng)精神勞模精神工匠精神》第1框《理解勞動(dòng)精神勞模精神工匠精神》-【中職專用】《職業(yè)道德與法治》同步課堂課件
- 2025美國(guó)國(guó)防部財(cái)年美軍武器裝備采購(gòu)預(yù)算中文版
- 70歲換證三力測(cè)試題附答案
- 中華醫(yī)學(xué)會(huì)利益沖突聲明模板
- 帶你玩轉(zhuǎn)VR虛擬現(xiàn)實(shí)智慧樹知到期末考試答案2024年
- DAM10KW中波發(fā)射機(jī)各單元的檢測(cè)與調(diào)整指導(dǎo)示意圖
評(píng)論
0/150
提交評(píng)論