




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、指 針就是地址。一、指向普通變量的指針(變量)1定義 int a; int *p; float b; float *q; char c; char *r; p=&a; q=&b; r=&c;【格式】 類型名 *指針變量名;【說明】 (1)“*”是單目運(yùn)算符,是“取內(nèi)容符”,但是,在定義時(shí)“*”不具備“取內(nèi)容符”的含義,僅僅是指針變量的標(biāo)志。(2)指針變量在使用前必須獲得合法空間的地址值或空地址值(NULL)。(3)“NULL”與0和0等值使用。它是一個(gè)系統(tǒng)提供的符號(hào)常量,使用前必須加頭文件“stdio.h”。【舉例】例1、任意讀入一個(gè)整數(shù),輸出它的平方。 main()i
2、nt a, *p; p=&a; scanf("%d",p); printf("%dn",(*p)*(*p);【法二】main()int a, *p =&a; /*定義時(shí)“*”沒有取內(nèi)容的含義*/ scanf("%d",p); printf("%dn",(*p)*(*p);【結(jié)論】本題中有如下等價(jià)式:(1) p與&a等價(jià)(2) *p與a等價(jià)(*p的含義是p所指空間里的值;或p所指變量的值;或取p對(duì)應(yīng)空間中的值)(3) *&a與a(4) *&p與p【注意:(1)*后面只能跟地址型
3、數(shù)據(jù);上例的程序段可以改寫成:int a, *p =&a;(2)定義時(shí)“*”只是一個(gè)標(biāo)志!】二、指向一維數(shù)組的指針(變量)1定義(與指向普通變量的指針的定義格式一樣)【格式】類型名 *指針變量名;【舉例】 int a5,*p; p=a; /* 與p=&a0;等價(jià) */ 則有用p表示的數(shù)組a的5個(gè)元素的新方式:*p即*(p+0) óa0*(p+1) óa1*(p+2) óa2*(p+3) óa3*(p+4) óa4此方式被稱為“指針法”,以前的方法被稱為“下標(biāo)法”?!菊f明】當(dāng)某指向數(shù)組的指針變量p加1后,指向下一個(gè)元素(注意:不是
4、其中的地址值+1(見課本p230-231注:指向數(shù)組的指針變量也可以帶下標(biāo),如pi與*(p+i)等價(jià),))。【等價(jià)替換】*p即*(p+0) óa0 óp0 ó*a*(p+1) óa1 óp1 ó *(a+1)*(p+2) óa2 óp2 ó *(a+2)*(p+3) óa3 óp3 ó *(a+3)*(p+4) óa4 óp4 ó *(a+4)2、指針的運(yùn)算(1)與整數(shù)的加減運(yùn)算(2)同類型的指針可以進(jìn)行:賦值、減法(3)同類型的指針不可以進(jìn)行加
5、法運(yùn)算(4)同類型的指針可以進(jìn)行比較運(yùn)算3、例題例1.main()float a3=1.5, 6.9, 9.05; float *p=a; printf("%fn",*+p);(即輸出a1,此處莫與輸出字符串時(shí)給出首地址相混淆,此處就是輸出某個(gè)變量)輸出6.9例2.main()float a3=1.5, 6.9, 9.05; float *p=a; printf("%fn",* p +);輸出1.5,p指著a1。例3.main()float a3=1.5, 6.9, 9.05; float *p=a; printf("%fn",(*
6、p )+);輸出1.5(之后,a0由1.5變成2.5)例4.main()float a3=1.5, 6.9, 9.05; float *p=a; printf("%fn",+ (* p );輸出2.5(a0由1.5變成2.5后再輸出)【注意】 +p(p+)是合法的,但是+a(a+)不合法,因?yàn)閍是數(shù)組名,是數(shù)組的首地址,是常量。【記住】(1)當(dāng)一個(gè)變量被一個(gè)指針變量指著時(shí),該變量就多了一個(gè)“名字”à*指針變量(2) int a5, *p; p=&a2; 則a0又可以表示成*(p-2)只有當(dāng)指針指著合法的連續(xù)空間時(shí)(數(shù)組),與整數(shù)進(jìn)行加減法運(yùn)算才有意義。 三
7、、指向字符串的指針1、定義(形式同普通字符型變量的指針) char *指針變量;2、如何指向一個(gè)字符串(1)定義的同時(shí) char *p="Hello"(為什么可如此定義?*p不是地址值嗎?)析:只要寫出字符串常量,系統(tǒng)獲得的信息是該串的首地址。(2)定義之后 char *p;p="Hello"(為什么可如此定義?p不是地址值嗎?)先讓字符串常量”Hello”“住在”內(nèi)存中,再將該內(nèi)存空間的首地址賦值給p。3、一維字符數(shù)組處理字符串與字符指針處理字符串的對(duì)比:(1)char *p; char a10; strcpy(p,"Hello")
8、;×strcpy(a, "Hello"); 前者錯(cuò),因?yàn)閜未指向任何合法空間,就用strcpy函數(shù)給p所指空間賦值是危險(xiǎn)的。后者是正確的,但要注意,在定義時(shí)要使數(shù)組具有足夠的存儲(chǔ)空間。(2)char *p; char a10; p="Hello" a="Hello" ×后者錯(cuò),因?yàn)閍是數(shù)組名,是數(shù)組首地址,是常量,不可以出現(xiàn)在賦值號(hào)左邊。前者是正確的,先讓字符串常量占據(jù)合法的連續(xù)空間,再將該空間的首地址賦值給指針變量。(3)char *p, a10; char a10;p=a; strcpy(p, "He
9、llo");strcpy(a, "Hello"); 二者都正確,完全等價(jià),都是將字符串常量賦值給數(shù)組a對(duì)應(yīng)的空間,前者只是先讓p指向數(shù)組a對(duì)應(yīng)的空間。(4)char *p, a10; char a10;p=a; p="Hello" strcpy(a, "Hello"); 雖然二者都正確,但后者是將字符串常量賦值給數(shù)組a對(duì)應(yīng)的空間,前者只是先讓p指向數(shù)組a對(duì)應(yīng)的空間,然后讓字符串常量占據(jù)另外合法的連續(xù)空間,再將該合法空間的首地址賦值給p,此時(shí)p已不指向數(shù)組a了。(5) 一定看筆記指針最后一點(diǎn),標(biāo)記p111四、二維數(shù)組及指針1、
10、指向二維數(shù)組的指針的定義設(shè)有如下定義和賦值:int a43=1,2,3,4,5,6,7,8,9,10,11,12;int *p, (*q)3(析:此處必須加圓括號(hào),因?yàn)榉嚼ㄌ?hào)(即下標(biāo)運(yùn)算符)優(yōu)先級(jí)高于圓括號(hào),若不加圓括號(hào),那么q3首先會(huì)結(jié)合形成一個(gè)數(shù)組,);p=&a00; /*p=a0*/q=a;則有下列存儲(chǔ)關(guān)系: p p+1 q 地址 101 103 105123456789101112 q+3前面介紹過,C語(yǔ)言允許將一個(gè)二維數(shù)組分解為多個(gè)一維數(shù)組來處理。因此數(shù)組a可分解為四個(gè)一維數(shù)組,即a0、a1、a2、a3,每一個(gè)一維數(shù)組又含有三個(gè)元素,因此,a0、a1、a2、a3是一維數(shù)組的名
11、字,是對(duì)應(yīng)一維數(shù)組的首地址。而C語(yǔ)言規(guī)定,數(shù)組名就是數(shù)組的首地址,因此,a是二維數(shù)組的首地址。&a00即p顯然也是二維數(shù)組的首地址,那么與a有什么區(qū)別呢?二者的值相等,根據(jù)上圖的假設(shè),地址值均為101,但p+1指向下一個(gè)元素a01,值為103,而a+1指向下一行,值為107。由此,我們通常將p稱為列指針(同指向變量的指針),a稱為行指針。但是a是數(shù)組名,是常量,于是,可以按如下格式定義一個(gè)二維數(shù)組對(duì)應(yīng)的行指針變量:類型說明符 (*指針變量名)所指二維數(shù)組的第二維長(zhǎng)度值;例如,上例中的q就是一個(gè)可以指向a的行指針變量。而p就可以叫做列指針了。(行指針+1則指向下一行,而列指針+1則指向下
12、一個(gè)元素)2、二維數(shù)組元素的引用(用指針)int a43=1,2,3,4,5,6,7,8,9,10,11,12;int *p, (*q)3;p=&a00; /*p=a0*/q=a;有以上定義和賦值后:a00 ó*pó*(p+0)ó*q ó*(*(q+0)+0)aij ó*(p+i*3+j) ó*(*(q+i)+j)兩大種四小種(用行指針描述更合適):qij等價(jià)aij等價(jià)*(*(q+i)+j) 等價(jià)ó*(*(a+i)+j)(qij等價(jià)于aij)設(shè)有上例的定義和賦值,則二維數(shù)組元素的引用如下:下標(biāo)法列指針表示行指針表示a
13、00*p或p0*q或*(*(q+0)+0)或q00a01*(p+1)或p1*(*(q+0)+1) 或q01a02*(p+2)或p2*(*(q+0)+2) 或q02aij*(p+i*3+j)或pi*3+j*(*(q+i)+j) 或qija32*(p+11)或p11*(*(q+3)+2) 或q32【識(shí)別技巧】由上圖可以發(fā)現(xiàn):行指針加上一個(gè)*或一個(gè)即為列指針,列指針加上一個(gè)*或一個(gè)即為二維數(shù)組的一個(gè)元素。反之,二維數(shù)組的元素去掉一個(gè)*或去掉一個(gè)或加上一個(gè)&即為列指針,列指針去掉一個(gè)*或去掉一個(gè)或加上一個(gè)&即為行指針。(理解見筆記)五、指針數(shù)組若一個(gè)數(shù)組的元素值為指針則是指針數(shù)組。指針
14、數(shù)組的所有元素都必須是具有相同存儲(chǔ)類型和指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組的定義說明形式為:類型說明符 *數(shù)組名常量表達(dá)式;其中類型說明符為指針值所指向的變量的類型。指針數(shù)組常用來表示一組字符串,這時(shí)指針數(shù)組的每個(gè)元素被賦予一個(gè)字符串的首地址。例如:對(duì)5個(gè)已知串排序(降序)。#include<stdio.h>#include<string.h>main()char *p5="Hi","C","bye","God","save" int i,j; char *t; for
15、(j=1;j<=4;j+) for(i=0;i<=4-j;i+) if(strcmp(pi,pi+1)<0) t=pi;pi=pi+1;pi+1=t; for(i=0;i<5;i+) puts(pi);【注意】指針數(shù)組與二維數(shù)組的行指針變量的區(qū)別。二維數(shù)組的行指針變量是單個(gè)的變量,其定義形式中“(*指針變量名)”兩邊的括號(hào)不可少。而指針數(shù)組表示的是多個(gè)指針,其定義形式中“*數(shù)組名”兩邊不能有括號(hào),這樣,由于的優(yōu)先級(jí)高于*,“數(shù)組名常量表達(dá)式”首先被認(rèn)定為數(shù)組。六、二級(jí)指針如果一個(gè)指針變量存放的又是另一個(gè)指針變量的地址,則稱這個(gè)指針變量為指向指針的指針變量,又稱二級(jí)指針。
16、定義格式如下: 類型說明符 *指針變量名;例如:int x,*p, *r; p=&x;/*p又叫一級(jí)指針*/ r=&p;二級(jí)指針變量的值必須是某個(gè)一級(jí)指針變量的地址,二級(jí)指針變量可以通過賦值方式指向某個(gè)一級(jí)指針變量,賦值格式如下:二級(jí)指針變量=&一級(jí)指針變量例如,有如下定義和賦值:int a,*p,*q;p=&a;q=&p;則有: *p等價(jià)于a;*q等價(jià)于p;*q即*(*q)等價(jià)于a?!究偨Y(jié)】例1、指向普通變量的指針int a,*p=&a;float b,*q;q=&b;有*p等價(jià)于a,p等價(jià)于&a例2、一維(元素=普通變量)int a5,*p;p=a;pi-ai-*(p+i)-*(a+i)例3、二維(元素=普通變量)int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保設(shè)施運(yùn)維合同樣本
- 專項(xiàng)信托外匯固定資產(chǎn)貸款合作合同
- 玫瑰貸記卡動(dòng)產(chǎn)質(zhì)押合同協(xié)議
- 員工合同解除合同書
- 贍養(yǎng)義務(wù)履行合同范文
- 聯(lián)合購(gòu)房按揭貸款合同
- 精簡(jiǎn)版商業(yè)租賃合同范本
- 租賃合同季度范本:機(jī)械設(shè)備篇
- 南湖區(qū):合同科技創(chuàng)新與合作新機(jī)遇
- 出租車股份合作合同條款
- 2024土方工程承包合同包含進(jìn)度支付與違約責(zé)任條款范本3篇
- 暑假假期安全教育(課件)-小學(xué)生主題班會(huì)
- 《脂肪肝de健康教育》課件
- 2025年外研版小學(xué)英語(yǔ)單詞表全集(一年級(jí)起1-12全冊(cè))
- Python爬蟲技術(shù)基礎(chǔ)介紹
- 中華民族共同體概論教案第四講-天下秩序與華夏共同體演進(jìn)
- 《傳媒法律法規(guī)》課件
- 數(shù)據(jù)中心供配電系統(tǒng)概述演示
- TSG11-2020鍋爐安全技術(shù)規(guī)程(現(xiàn)行)
- 人力資源行業(yè)人力資源管理信息系統(tǒng)實(shí)施方案
- 歌曲《wake》中英文歌詞對(duì)照
評(píng)論
0/150
提交評(píng)論