版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
提優(yōu)增速——指針項(xiàng)目8任務(wù)1指針的概念指針與函數(shù)指針與數(shù)組目錄CONTENTS任務(wù)2任務(wù)3
課程思政1.指針部分比較復(fù)雜,同學(xué)們?cè)谡{(diào)試程序的過程中,需要培養(yǎng)自己的耐心和戰(zhàn)勝困難的意志力。2指針是開啟C語言在數(shù)據(jù)結(jié)構(gòu)、底層開發(fā)等方面重要作用的鑰匙,同學(xué)們也需要積累自己的知識(shí)、提升能力,為將來做好準(zhǔn)備。3.同學(xué)們?cè)趯W(xué)習(xí)指針部分可以采用團(tuán)隊(duì)合作的方式,增強(qiáng)同學(xué)們的集體主義精神。項(xiàng)目8:提優(yōu)增速——指針任務(wù)1指針的概念8.1.1指針及指針變量在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲(chǔ)器中的。為了便于訪問這些內(nèi)存單元,就給每個(gè)內(nèi)存單元編上了號(hào),而把內(nèi)存單元的編號(hào)就叫做地址。在編寫C語言程序時(shí)所定義的變量,系統(tǒng)會(huì)為該變量分配一個(gè)地址,稱為變量的地址。例如,inta;floatb;假設(shè)系統(tǒng)分配給變量a兩個(gè)存儲(chǔ)單元,地址為1000和1001,分配給變量b四個(gè)存儲(chǔ)單元,地址為1002、1003、1004、1005,則a的起始地址為1000,即為a在內(nèi)存中的地址,同理1002為變量b在內(nèi)存中的地址。
1、指針變量的定義C語言規(guī)定,變量在使用之前必須先定義,指針變量也是如此。指針變量定義的一般形式:類型標(biāo)識(shí)符*變量名;其中,*表示這是一個(gè)指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型。例如:int*p1;表示p1是一個(gè)指針變量,它的值是某個(gè)整型變量的地址。或者說p1指向一個(gè)整型變量。至于p1究竟指向哪一個(gè)整型變量,應(yīng)由向p1賦予的地址來決定。再如:int*p2;/*p2是指向整型變量的指針變量*/float*p3;/*p3是指向浮點(diǎn)變量的指針變量*/char*p4;/*p4是指向字符變量的指針變量*/
8.1.2指針變量的定義和引用2、指針變量的引用指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值。兩個(gè)有關(guān)的運(yùn)算符:*:指針運(yùn)算符,取指針變量指向地址中所存儲(chǔ)的變量。&:取地址運(yùn)算符。C語言中提供了地址運(yùn)算符&來表示變量的地址。其一般形式為:&變量名;如&a表示變量a的地址,&b表示變量b的地址。變量本身必須預(yù)先說明。.設(shè)有指向整型變量的指針變量p,如要把整型變量a的地址賦予p,可以有以下兩種方式:指針變量初始化的方法inta;int*p=&a;賦值語句的方法inta;int*p;p=&a;不允許把一個(gè)數(shù)賦予指針變量,故下面的賦值是錯(cuò)誤的:int*p;p=1000;被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a也是錯(cuò)誤的。例如:inti=200,x;/*定義了兩個(gè)整型變量i,x*/int*ip;/*定義了指向整型數(shù)的指針變量ip*/ip=&i;/*i的地址賦給ip*/此時(shí)指針變量ip指向整型變量i,假設(shè)變量i的地址為1800,這個(gè)賦值可形象理解為圖8-2所示的聯(lián)系。圖8-2指針變量與變量間的關(guān)系指針運(yùn)算與一般的整數(shù)運(yùn)算是有區(qū)別的,前面剛講過的兩個(gè)運(yùn)算符“*”和“&”符號(hào)例如,inta,*p,x;p=&a;表示取變量a的地址賦值為p。x=*p;
表示取指針變量所指向的存儲(chǔ)單元的內(nèi)容賦值給變量x。以上,相當(dāng)于x=a?!纠?-1】分析下面的程序。#include<stdio.h>voidmain(){inta=5,*p=&a;printf(“a=%d\n”,*p);}3、
指針的運(yùn)算1)賦值運(yùn)算指針變量和一般變量一樣,存放在它們之中的值是可以改變的,也就是說可以改變它們的指向,例如,inti,j,*p1,*p2;i='a';j='b';p1=&i;p2=&j;則建立如圖8-2所示的聯(lián)系這時(shí)賦值表達(dá)式:p2=p1;如圖8-3所示:【例8-2】分析如下程序。#include<stdio.h>voidmain(){inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf("a=%d,b=%d\n",a,b);printf("*p1=%d,*p2=%d\n",*p1,*p2);}程序運(yùn)行結(jié)果:【例8-3】輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a和b。#include<stdio.h>voidmain(){int*p1,*p2,*p,a,b;scanf("%d%d",&a,&b);p1=&a;p2=&b;if(a<b){p=p1;
p1=p2;p2=p;}printf("\na=%d,b=%d\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);}假設(shè)從鍵盤輸入6和10,程序運(yùn)行結(jié)果:2)算術(shù)運(yùn)算指針變量可出功現(xiàn)在表達(dá)式中,假如,intx,y,*px=&x;指針變量px指向整數(shù)x,則*px可出現(xiàn)在x能出現(xiàn)的任何地方。例如:y=*px+5;
/*表示把x的內(nèi)容加5并賦給y*/y=++*px;
/*px的內(nèi)容加上1之后賦給y,++*px相當(dāng)于++(*px)*/y=*px++;
/*相當(dāng)于y=*px;px++*/還可以出現(xiàn),指針變量±n的形式,只有在指針變量指向數(shù)組時(shí),才有意義。在后面相關(guān)項(xiàng)目中介紹?!緡加?xùn)練】【國考訓(xùn)練】謝謝大家的聆聽任務(wù)2指針與函數(shù)1、
指針作為函數(shù)的參數(shù)2、
指針型函數(shù)3、
函數(shù)指針1、
指針作為函數(shù)的參數(shù)函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中?!纠?-4】題目同例8-3,即輸入的兩個(gè)整數(shù),按大小順序輸出。今用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。#include<stdio.h>voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}任務(wù)2指針與函數(shù)voidmain(){inta,b;int*pointer_1,*pointer_2;scanf("%d%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\nmax=%d,min=%d\n",a,b);}對(duì)程序運(yùn)行的說明:swap是用戶定義的函數(shù),它的作用是交換兩個(gè)變量(a和b)的值。swap函數(shù)的形參p1、p2是指針變量。程序運(yùn)行時(shí),先執(zhí)行main函數(shù),輸入a和b的值。然后將a和b的地址分別賦給指針變量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。如圖8-4所示。接著執(zhí)行if語句,由于a〈b,因此執(zhí)行swap函數(shù)。注意實(shí)參pointer_1和pointer_2是指針變量,在函數(shù)調(diào)用時(shí),將實(shí)參變量的值傳遞給形參變量。采取的依然是“值傳遞”方式。因此虛實(shí)結(jié)合后形參p1的值為&a,p2的值為&b。這時(shí)p1和pointer_1指向變量a,p2和pointer_2指向變量b。如圖8-5所示。接著執(zhí)行swap函數(shù)的函數(shù)體使*p1和*p2的值互換,也就是使a和b的值互換。如圖8-6所示。函數(shù)調(diào)用結(jié)束后,p1和p2不復(fù)存在(已釋放)如圖8-7所示。
【例8-5】請(qǐng)注意,不能企圖通過改變指針形參的值而使指針實(shí)參的值改變。#include<stdio.h>swap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}voidmain(){inta,b;int*pointer_1,*pointer_2;scanf("%d%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\na=%d,b=%d\n",a,b);printf("\nmax=%d,min=%d\n",*pointer_1,*pointer_2);}假設(shè)從鍵盤輸入5和9,程序運(yùn)行結(jié)果:定義指針型函數(shù)的一般形式為:
類型說明符*函數(shù)名(形參表){……/*函數(shù)體*/}其中函數(shù)名之前加了“*”號(hào)表明這是一個(gè)指針型函數(shù),即返回值是一個(gè)指針。類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型。如:int*ap(intx,inty){/*函數(shù)體*/}表示ap是一個(gè)返回指針值的指針型函數(shù),它返回的指針指向一個(gè)整型變量。2、
指針型函數(shù)
【例8-6】
本程序是通過指針函數(shù),輸入一個(gè)1~7之間的整數(shù),輸出對(duì)應(yīng)的星期名。#include<stdio.h>#include<stdlib.h>voidmain(){inti;char*day_name(intn);printf("請(qǐng)輸入1-7的整數(shù):");scanf("%d",&i);if(i<0)exit(1);printf("對(duì)應(yīng)的星期:%2d-->%s\n",i,day_name(i));}char*day_name(intn){staticchar*name[]={"Illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};return((n<1||n>7)?name[0]:name[n]);}程序的運(yùn)行結(jié)果函數(shù)指針變量定義的一般形式為:類型說明符
(*指針變量名)();其中“類型說明符”表示被指函數(shù)的返回值的類型?!?*指針變量名)”表示“*”后面的變量是定義的指針變量。最后的空括號(hào)表示指針變量所指的是一個(gè)函數(shù)。例如:int(*pf)();表示pf是一個(gè)指向函數(shù)入口的指針變量,該函數(shù)的返回值(函數(shù)值)是整型。
3、
函數(shù)指針
【例8-7】本例用來說明用指針形式實(shí)現(xiàn)對(duì)函數(shù)調(diào)用的方法。#include<stdio.h>intmax(inta,intb){if(a>b)returna;elsereturnb;}voidmain(){intmax(inta,intb);int(*pmax)();intx,y,z;pmax=max;printf("inputtwonumbers:\n");scanf("%d%d",&x,&y);z=(*pmax)(x,y);printf("maxmum=%d",z);}【國考訓(xùn)練】【國考訓(xùn)練】謝謝大家的聆聽任務(wù)3指針與數(shù)組
1、
指向數(shù)組元素的指針2、
通過指針引用數(shù)組元素3、
數(shù)組名作為函數(shù)參數(shù)4、
指針數(shù)組5、main函數(shù)的參數(shù)一個(gè)變量有一個(gè)地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。所謂數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。1、
指向數(shù)組元素的指針定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指針變量相同。例如:inta[10];/*定義a為包含10個(gè)整型數(shù)據(jù)的數(shù)組*/int*p;/*定義p為指向整型變量的指針*/下面是對(duì)指針變量賦值:p=&a[0];把a(bǔ)[0]元素的地址賦給指針變量p。也就是說,p指向a數(shù)組的第0號(hào)元素。如圖8-8所示。任務(wù)3指針與數(shù)組
C語言規(guī)定,數(shù)組名代表數(shù)組的首地址,也就是第0號(hào)元素的地址。因此,下面兩個(gè)語句等價(jià):p=&a[0];p=a;在定義指針變量時(shí)可以賦給初值:int*p=&a[0];它等效于:int*p;p=&a[0];當(dāng)然定義時(shí)也可以寫成:int*p=a;
注意:p,a,&a[0]均指向同一單元,它們是數(shù)組a的首地址,也是0號(hào)元素a[0]的首地址。應(yīng)該說明的是p是變量,而a,&a[0]都是常量。所以在程序設(shè)計(jì)中,p++;是對(duì)的,而寫a++;或&a[0]++;都是錯(cuò)誤的。數(shù)組指針變量說明的一般形式為:類型說明符*指針變量名;其中類型說明符表示所指數(shù)組的類型。
C語言規(guī)定:如果指針變量p已指向數(shù)組中的一個(gè)元素,則p+1指向同一數(shù)組中的下一個(gè)元素。引入指針變量后,就可以用兩種方法來訪問數(shù)組元素了。如果p的初值為&a[0],則:(1)p+i和a+i就是a[i]的地址,或者說它們指向a數(shù)組的第i個(gè)元素。如圖8-9所示(2)*(p+i)或*(a+i)就是p+i或a+i所指向的數(shù)組元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。(3)指向數(shù)組的指針變量也可以帶下標(biāo),如p[i]與*(p+i)等價(jià)。根據(jù)以上敘述,引用一個(gè)數(shù)組元素可以用:(1)下標(biāo)法,即用a[i]形式訪問數(shù)組元素。在前面介紹數(shù)組時(shí)都是采用這種方法。(2)指針法,即采用*(a+i)或*(p+i)形式,用間接訪問的方法來訪問數(shù)組元素,其中a是數(shù)組名,p是指向數(shù)組的指針變量,即p=a。2、
通過指針引用數(shù)組元素
【例8-8】輸出數(shù)組中的全部元素。(下標(biāo)法)#include<stdio.h>voidmain(){inta[10],i;for(i=0;i<10;i++)a[i]=i;for(i=0;i<10;i++)printf("a[%d]=%d\n",i,a[i]);}程序運(yùn)行結(jié)果:
【例8-9】輸出數(shù)組中的全部元素。(通過數(shù)組名計(jì)算元素的地址,找出元素的值)#include<stdio.h>voidmain(){inta[10],i;for(i=0;i<10;i++)*(a+i)=i;for(i=0;i<10;i++)printf("a[%d]=%d\n",i,*(a+i));}程序運(yùn)行結(jié)果:【例8-10】輸出數(shù)組中的全部元素。(用指針變量指向元素)#include<stdio.h>voidmain(){inta[10],i,*p;p=a;for(i=0;i<10;i++)*(p+i)=i;for(i=0;i<10;i++)printf("a[%d]=%d\n",i,*(p+i));}程序運(yùn)行結(jié)果同【例8-9】?!纠?-11】輸出數(shù)組中的全部元素(借助指針的累增變化找出元素的值)。
#include<stdio.h>voidmain(){inta[10],i,*p=a;for(i=0;i<10;){*p=i;printf("a[%d]=%d\n",i++,*p++);}}程序運(yùn)行結(jié)果同【例8-9】。
幾個(gè)注意的問題:(1)指針變量可以實(shí)現(xiàn)本身的值的改變。如p++是合法的;而a++是錯(cuò)誤的。因?yàn)閍是數(shù)組名,它是數(shù)組的首地址,是常量。(2)從上例可以看出,雖然定義數(shù)組時(shí)指定它包含10個(gè)元素,但指針變量可以指到數(shù)組以后的內(nèi)存單元,系統(tǒng)并不認(rèn)為非法。(3)*p++,由于++和*同優(yōu)先級(jí),結(jié)合方向自右而左,等價(jià)于*(p++)。(4)*(p++)與*(++p)作用不同。若p的初值為a,則*(p++)等價(jià)a[0],*(++p)等價(jià)a[1]。(5)(*p)++表示p所指向的元素值加1。(6)如果p當(dāng)前指向a數(shù)組中的第i個(gè)元素,則:*(p--)相當(dāng)于a[i--];*(++p)相當(dāng)于a[++i];*(--p)相當(dāng)于a[--i]。要注意指針變量的當(dāng)前值。請(qǐng)看下面的程序。【例8-12】閱讀下面的程序,分析程序輸出的結(jié)果,查找出錯(cuò)誤的原因
。
#include<stdio.h>voidmain(){int*p,i,a[10];p=a;for(i=0;i<10;i++)*p++=i;for(i=0;i<10;i++)printf("a[%d]=%d\n",i,*p++);}
數(shù)組名可以作函數(shù)的實(shí)參和形參。如:#include<stdio.h>voidmain(){intarray[10];…………f(array,10);…………}3、
數(shù)組名作為函數(shù)參數(shù)
f(intarr[],intn){…………}array為實(shí)參數(shù)組名,arr為形參數(shù)組名。數(shù)組名就是數(shù)組的首地址,實(shí)參向形參傳送數(shù)組名實(shí)際上就是傳送數(shù)組的地址,形參得到該地址后也指向同一數(shù)組。這就好象同一件物品有兩個(gè)彼此不同的名稱一樣?!纠?-13】數(shù)組名作為函數(shù)參數(shù)實(shí)例。#include<stdio.h>voiddata_put(int*str,intn){inti;for(i=0;i<n;i++)printf("%3d",*(str+i));printf("\n");}voidmain(){inta[6]={1,2,3,4,5,6};data_put(a,6);}
歸納起來,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下4種,如表8-1所示。
實(shí)參形參數(shù)組名數(shù)組名數(shù)組名指針變量指針變量數(shù)組名指針變量指針變量在C語言中,可以用兩種方法訪問一個(gè)字符串。(1)用字符數(shù)組存放一個(gè)字符串,然后輸出該字符串。(2)用字符串指針指向一個(gè)字符串?!纠?-14】用字符數(shù)組存放一個(gè)字符串。#include<stdio.h>voidmain(){charstring[]=”IloveChina!”;/*字符數(shù)組存放字符串*/printf("%s\n",string);
/*整體引用輸出*/}2、
字符指針
【例8-15】字符指針的應(yīng)用。#include<stdio.h>voidmain(){char*str=”IloveChina!”;/*字符指針string指向字符串*/printf("%s\n",str);
/*整體引用輸出*/}運(yùn)行結(jié)果同例8-14。對(duì)指向字符變量的指針變量應(yīng)賦予該字符變量的地址。如:charc,*p=&c;表示p是一個(gè)指向字符變量c的指針變量。而:char*s="CLanguage";則表示s是一個(gè)指向字符串的指針變量。把字符串的首地址賦予s。再例如:char*s="CLanguage";等效于:char*s;s="CLanguage";【例8-16】輸出字符串中n個(gè)字符后的所有字符。#include<stdio.h>voidmain(){char*p,*ps="thisisabook";/*把字符串首地址賦予ps*/inti,n=10;p=ps;
/*把ps原值保存下來*/ps=ps+n;/*ps+10后,指向字符"b"*/printf("%s\n",ps);for(i=0;p[i]!='\0';i++)printf("%c",p[i]);/*逐個(gè)引用*/printf("\n");}運(yùn)行結(jié)果為:【例8-17】用指針方法,求字符串長度。#include<stdio.h>voidmain(){char*p,str[80];intn;printf("輸入字符串:");gets(str);p=str;while(*p!='\0')p++;n=p-str;printf("字符串:%s的長度=%d\n",str,n);}
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工消防知識(shí)培訓(xùn)內(nèi)容
- 倉儲(chǔ)部出貨培訓(xùn)
- 員工操作技能提升培訓(xùn)方案
- 倉儲(chǔ)物流NC系統(tǒng)課件
- 倉儲(chǔ)員工培訓(xùn)課件
- 2026年保密技術(shù)協(xié)議合同二篇
- 員工崗位職責(zé)培訓(xùn)計(jì)劃
- 《整數(shù)乘法運(yùn)算律推廣到小數(shù)》教案
- 收費(fèi)站各項(xiàng)制度
- 員工獎(jiǎng)懲管理培訓(xùn)
- 千古奇文《初心》原文
- 失禁相關(guān)性皮炎與壓力性損傷的區(qū)分鑒別
- 鋁合金門窗設(shè)計(jì)說明
- MUX-2MD繼電保護(hù)信號(hào)數(shù)字復(fù)接接口裝置說明書
- 食品行業(yè)倉庫盤點(diǎn)制度及流程
- 2025年機(jī)車調(diào)度員崗位培訓(xùn)手冊(cè)考試題庫
- 北京市通州區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期末考試語文試卷(含答案)
- 2024四川綿陽涪城區(qū)事業(yè)單位選調(diào)(聘)筆試管理單位遴選500模擬題附帶答案詳解
- 發(fā)貨組年終總結(jié)
- 《化工制圖》試題及參考答案 (C卷)
- 新疆維吾爾自治區(qū)伊犁哈薩克自治州2023-2024學(xué)年八年級(jí)下學(xué)期期中數(shù)學(xué)試題
評(píng)論
0/150
提交評(píng)論