第7章指針1(指針變量做參數(shù)、字符指針)_第1頁
第7章指針1(指針變量做參數(shù)、字符指針)_第2頁
第7章指針1(指針變量做參數(shù)、字符指針)_第3頁
第7章指針1(指針變量做參數(shù)、字符指針)_第4頁
第7章指針1(指針變量做參數(shù)、字符指針)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第7章指針指針是C語言的一個(gè)重要概念,也是C語言的重要特色。通過指針可以表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);實(shí)現(xiàn)動態(tài)分配內(nèi)存和使用內(nèi)存;方便處理字符串;有效地訪問數(shù)組;能帶出函數(shù)的多個(gè)運(yùn)算結(jié)果;能直接處理內(nèi)存地址等。掌握指針的應(yīng)用,可使程序簡潔、緊湊、高效!不掌握指針就沒掌握C的精華!第7章指針7.1指針概述7.2指針和數(shù)組間的關(guān)系7.3指針數(shù)組7.4帶參數(shù)的main()函數(shù)7.5動態(tài)數(shù)組的實(shí)現(xiàn)

7.1指針(Pointer)概述一、問題的提出

-----為什么需要使用指針?

例:編寫函數(shù)實(shí)現(xiàn)兩數(shù)的交換voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}#include<stdio.h>voidSwap(intx,inty);intmain(void){inta,b;

a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);return0;}該程序能實(shí)現(xiàn)兩數(shù)的交換嗎?二、地址和指針的概念(一)內(nèi)存單元的地址

和其中的內(nèi)容⒈內(nèi)存單元的地址

計(jì)算機(jī)的內(nèi)部存儲器是由若干個(gè)單元組成的,每一個(gè)單元中可存放一個(gè)字節(jié)的信息。為了能區(qū)分不同的單元,對這些單元分別編號,此編號即為內(nèi)存單元的地址。聲明變量時(shí)必須理解變量名、類型、所占字節(jié)數(shù)、地址……

FAC0

FAC1

FAC2內(nèi)部存儲器地址

FAC4

FAC3inta=3,b=9,*p,*q;

FAC0

FAC1

FAC5內(nèi)部存儲器地址

FAC2

FAC4

FAC6

FAC7

FAC8

FAC9

FACF

FACA

FACB

FACC

FACD

FACEabp

FAC3q39FAC0FAC4首地址首地址首地址首地址指針如下語句如何理解?p=&a;q=&b;注意:a,b為簡單變量,可以存儲數(shù)據(jù);p,q為指針變量,只能存地址,無存儲數(shù)據(jù)的空間!

實(shí)質(zhì)為P指針指向變量a,而變量a為p指針?biāo)赶蜃兞?,因此可以有?p=6;而*p即表示指針p所指變量!

常見錯(cuò)誤:int*p;p=3;如下語句又如何理解?p=&a;q=p;2.指針及指針變量⑴指針(也叫變量的指針):

在C中,將地址形象化地稱為指針。一個(gè)變量的地址稱為該變量的指針。⑵指針變量:

在C中,有一種特殊的變量,它是專門用來存放另一個(gè)變量地址的變量,我們稱它為指針變量。⑶指向(也叫指針?biāo)缸兞浚?/p>

通過指針變量中的指針(地址)值所能找到的變量單元,稱之為:地址“指向”變量單元(也叫指針?biāo)缸兞浚? inta=10,*p; p=&a;10&apa三、如何定義指針變量?

⒈定義指針變量的一般形式

類型標(biāo)識符*指針變量名注意:(1)類型標(biāo)識符用來說明指針變量能制向的變量類型,也叫指針的基類型;(2)“*”表示聲明指針變量;指針變量名由用戶指定。(3)指針變量是要分配存儲空間的,大小為4字節(jié),必須注意的是其中只能存放地址值,而不能存儲一般的數(shù)據(jù)。例如:int*pointer_1,*pointer_2;(可以存放整型變量的地址)float*pointer_3;(可以存放實(shí)型變量的地址)char*pointer_4;(可以存放字符型變量的地址)指針變量能存放任意類型的地址嗎?inti,*p;p=&i;

int*p;float*q;p=q;inti;float*p;p=&i;inta=5,*p;p=a;判斷是對?是錯(cuò)?指針變量只存放地址!一個(gè)指針變量不能指向與其類型不同的變量!我是正確的,你猜對了嗎?應(yīng)在類型相同的指針變量之間賦值2.&與*操作符

&用來取變量的地址

*用來訪問指針變量所指向的內(nèi)存中的數(shù)據(jù)(3)int*p,a[10];

p=&a[0]; *p=20;(4) int*p,a[10];

p=&a[5]; *p=20;(1)inti=3,*p;

p=&i;printf(“*p=%d”,*p);(2)int*p,a[10];

p=a; *p=20; printf(“a[0]=%d”,a[0]);例1:

通過指針變量訪問整型變量(在調(diào)試狀態(tài)下查看各變量的值)#include<stdio.h>intmain(void){ inta=100,b=10; int*p1,*p2; p1=&a; p2=&b; printf(“%d,%d\n”,a,b); printf(“%d,%d\n”,*p1,*p2); printf(“%p,%p\n”,&a,&b); printf(“%x,%x\n”,p1,p2); printf(“%p,%p\n”,&p1,&p2); return0;}四、指針的運(yùn)算(一)關(guān)系運(yùn)算指向同一種數(shù)據(jù)類型的兩個(gè)指針變量才能進(jìn)行關(guān)系運(yùn)算值為1(真)或0(假)p>qp<qp==q注意:是判斷地址的大小,而絕對不是數(shù)據(jù)值的大小。不能與非指針類型變量進(jìn)行比較,但可與NULL(為指針常量,即空(0)值)進(jìn)行等或不等的關(guān)系運(yùn)算判斷p是否為空指針P==NULLp!=NULL(二)賦值運(yùn)算

1.指針變量的賦值——賦地址

指針變量在使用前一定要賦值;為指針變量賦的值必須是一個(gè)地址。intmain(void){

int*p; scanf("%d",p);…}intmain(void){

inta,*p=&a;scanf("%d",p);…}錯(cuò)!但TC下不報(bào)錯(cuò)VC下報(bào)錯(cuò)例如:理解如下指針變量的賦值結(jié)果:intmain(void){inta=10,b=20,*p,*q;

p=&a;/*使指針變量p指向變量a*/q=&b;/*使指針變量q指向變量b*/p=q;/*使p指針變量獲得指針變量q中的地址*//*或者q=p;*/printf(“a=%db=%d\n”,a,b);printf(“a=%db=%d\n”,*p,*q);return0;}2.指針?biāo)缸兞康馁x值——賦數(shù)據(jù)格式:*指針變量名=<數(shù)據(jù)值|表達(dá)式>例如:intmain(void){inta,b,*p,*q;p=&a;/*使指針變量p指向變量a*/q=&b;/*使指針變量q指向變量b*/*p=10;/*給p指針?biāo)缸兞縜賦值為10*/*q=*p+20;/*給q指針?biāo)缸兞縝賦值為30*/printf(“a=%db=%d\n”,a,b);return0;}五、指針變量作為函數(shù)參數(shù)

函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是將一個(gè)變量的地址傳到另一個(gè)函數(shù)中____單向傳址。1、函數(shù)的聲明形式:函數(shù)結(jié)果類型名函數(shù)名(類型名*指針變量){<函數(shù)體語句部分>;}注意:函數(shù)的形參為指針類型,它用來接受函數(shù)調(diào)用時(shí)對應(yīng)實(shí)參的地址。2、函數(shù)的調(diào)用形式:

函數(shù)名(指針變量名|&變量名

)注意:實(shí)參數(shù)必須是變量的地址值或指針變量。例如:指針作函數(shù)參數(shù)的簡單形式#include<stdio.h>voidf(double*p);intmain(void){doublex1;…f(&x1);/*調(diào)用函數(shù)時(shí)實(shí)參為變量地址*/…}voidf(double*p)/*函數(shù)的形式參數(shù)為指針變量*/{…}x1指針變量

pFFC0形參指針變量p指向?qū)崊⒆兞縳1voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}intmain(void){inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);

return0;}

voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}intmain(void){inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);return0;}程序1程序2例1:編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換主調(diào)函數(shù)被調(diào)函數(shù)實(shí)參形參結(jié)果有何不同?NotWork!Why?主調(diào)函數(shù)被調(diào)函數(shù)intmain(void){

inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);return0;}voidSwap(intx,inty){

inttemp;temp=x;x=y;y=temp;}15ab實(shí)參形參8程序1xytemp實(shí)參傳值給形參主調(diào)函數(shù)被調(diào)函數(shù)intmain(void){

inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);}voidSwap(int*x,int*y){

inttemp;temp=*x;*x=*y;*y=temp;}&a實(shí)參形參&b程序2xytempab815實(shí)參傳地址給形參形參和實(shí)參為同一單元例2:利用指針變量將函數(shù)的多個(gè)運(yùn)算結(jié)果帶出函數(shù)__這是指針最重要的應(yīng)用之一!

如定義一個(gè)根據(jù)圓的半徑,計(jì)算該圓的直徑、周長和面積的函數(shù),然后調(diào)用該函數(shù)。#include<stdio.h>#definePI3.1415926doubleCircle(doubler,double*c1,double*s1);intmain(void){ doubler,ll,cc,ss; printf("Pleaseinputrdata:"); scanf("%lf",&r); ll=Circle(r,&cc,&ss); printf("l=%.2fc=%.2fs=%.2f\n",ll,cc,ss); return0;}DoubleCircle(doubler,double*c1,double*s1){ doublel1; l1=2*r; *c1=2*PI*r; *s1=PI*r*r; returnl1;}注意:該函數(shù)計(jì)算的圓直徑值是用return字句帶出函數(shù)的,而圓的周長和面積值是通過指針帶出函數(shù)的!swap函數(shù)的幾種錯(cuò)誤形式(1/2)參數(shù)單向傳遞#include<stdio.h>voidSwap(int*p1,int*p2);intmain(void){ inta,b; a=15; b=8; Swap(&a,&b); printf("a=%d,b=%d",a,b);return0;}voidSwap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}為什么是錯(cuò)的呢?它到底交換的是啥?swap函數(shù)的幾種錯(cuò)誤形式(2/2)指針p沒有確切的地址#include<stdio.h>voidSwap(int*p1,int*p2);intmain(void){ inta,b; a=15; b=8; Swap(&a,&b); printf("a=%d,b=%d",a,b);}voidSwap(int*p1,int*p2){ int*p; *p=*p1; *p1=*p2; *p2=*p;}它又交換的是啥東東呢? voidsub1(chara,charb) { charc; c=a;a=b;b=c; }

voidsub2(char*a,charb) { charc; c=*a;*a=b;b=c;}

voidsub3(char*a,char*b) { charc; c=*a;*a=*b;*b=c; }

以下程序的輸出結(jié)果是()。#include<stdio.h>voidsub1(chara,charb);

voidsub2(char*a,charb);voidsub3(char*a,char*b);intmain(void)

{ chara,b;

a=‘A’;b=‘B’; sub3(&a,&b); putchar(a); putchar(b);

a=‘A’;b=‘B’; sub2(&a,b); putchar(a); putchar(b);

a=‘A’;b=‘B’; sub1(a,b); putchar(a); putchar(b);

return0;}六、字符指針作為函數(shù)參數(shù)(一)串的表示:字符數(shù)組或字符指針C語言并沒有為字符串提供任何專門的表示法,完全是使用字符數(shù)組和字符指針來處理字符串。字符串一串以'\0'結(jié)尾的字符字符數(shù)組每個(gè)元素都是字符類型的數(shù)組charstring[100];字符指針指向字符類型的指針char*p;(二)字符指針變量與字符數(shù)組的區(qū)別

1、定義方法不同

數(shù)組charstr[10];

指針

char*ptr;

2、賦值方法不同

數(shù)組charstr[10];str=”china”;/*錯(cuò)誤*/strcpy(str,”china”);/*正確*/

指針char*ptr;ptr=”china”;(三)使用字符指針的注意事項(xiàng)

字符指針變量必須有明確的指向,否則使用是危險(xiǎn)的。(思考:為什么呢?)例如,輸入字符串時(shí)char*a;scanf("%s",a);/*錯(cuò)誤*/

應(yīng)為:

char*a;

charstr[10];a=str;

scanf("%s",a);/*正確*/#include<stdio.h>voidMyStrcpy(char*p2,constchar*p1){ while(*p1!='\0') { *p2=*p1; p1++; p2++; } *p2='\0';}例1:字符串拷貝——用字符指針編程intmain(void){ chara[80],b[80]; printf(“Pleaseenterastring:”); gets(a);

MyStrcpy(b,a); printf(“Thecopyis:”); puts(b);return0;}c

a

t

\0

a

a[6]

a[5]

a[4]

a[3]

a[2]

a[1]

a[0]p1

b

b[11]

b[10]

b[9]

b[8]

b[7]

b[6]

b[5]

b[4]

b[3]

b[2]

b[1]

b[0]p2當(dāng)只允許函數(shù)訪問地址內(nèi)容,不允許修改時(shí),可以把函數(shù)的指針參數(shù)定義為const例2:P808.c兩個(gè)字符串的交錯(cuò)插入連接—----用字符指針編程實(shí)現(xiàn)。#include<string.h>#defineN128voidconj(char*string1,

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論