




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十章 指針10.1 地址和指針的概念10.2 指針定義和援用10.3 指針與數(shù)組10.4 指針與字符串10.1 地址和指針的概念一、數(shù)據(jù)的存取一、數(shù)據(jù)的存取1、內(nèi)存地址內(nèi)存的每個(gè)字節(jié)都有一個(gè)編號(hào),這個(gè)編號(hào)稱為“內(nèi)存地址。低地址高地址2000200220043000程序中的每個(gè)數(shù)據(jù)都對(duì)應(yīng)著內(nèi)存中的一個(gè)地址,從該地址開(kāi)場(chǎng)的一個(gè)或多個(gè)字節(jié)用來(lái)存放該數(shù)據(jù)。int i, j, k;ijk2、內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容的區(qū)別:假設(shè)i=3, j=5; 00000011000000000000010100000000從圖中可以看出它們的區(qū)別。程序編譯后曾經(jīng)沒(méi)有i、j、k這些變量名了,而是將變量名轉(zhuǎn)換為變
2、量的地址,計(jì)算機(jī)經(jīng)過(guò)內(nèi)存地址對(duì)變量進(jìn)展存取。二、直接訪問(wèn)和間接訪問(wèn)二、直接訪問(wèn)和間接訪問(wèn)1、直接訪問(wèn)方式:低地址高地址2000200220043000ijk00000011000000000000010100000000、i=3;、j=i+2;、printf(%d, i);、scanf(%d, &i);、k=i+j; 如何執(zhí)行?0000100000000000按變量的地址存取變量的方式2、間接訪問(wèn)方式:言語(yǔ)中可以定義整型變量、實(shí)型變量、字符型變量,各自存放相應(yīng)類型的數(shù)據(jù);另外還可以定義和運(yùn)用一種特殊類型的變量,用來(lái)存放變量的地址。低地址高地址2000200220043000ijk0000001
3、10000000000000101000000000000100000000000假設(shè)曾經(jīng)定義變量 ip 用來(lái)存放整型變量的地址,它被分配到內(nèi)存單元3000和3001。ip經(jīng)過(guò)執(zhí)行語(yǔ)句:ip=&i; 將整型變量i 的地址存放到變量ip中,即ip的值為變量i所對(duì)應(yīng)的內(nèi)存單元的起始地址2000。2000如今要存取i的值可以這樣做:先找到存放i的地址的內(nèi)存單元地址(3000和3001),從中取出變量i的地址(2000),然后再對(duì)2000和2001單元進(jìn)展存取這就稱為間接訪問(wèn)。3、關(guān)于“指向的含義:變量ip的值為2000,即變量i的地址,這樣就在ip和i之間建立了一種聯(lián)絡(luò):經(jīng)過(guò)變量ip知道變量i的地址
4、,從而找到變量i的內(nèi)存單元,因此說(shuō)變量ip指向變量i,用箭頭表示這種“指向關(guān)系。20003000ip2000i4、為了表示將數(shù)值10送到變量i中,可以有兩種表示方法:、將10送到變量i所標(biāo)志的單元中;2000i10、將10送到變量ip所指向的單元中;20003000ip2000i10三、指針與指針變量三、指針與指針變量經(jīng)過(guò)地址能找到所需的變量單元,可以說(shuō):地址“指向該變量單元。因此,把一個(gè)變量的地址稱為該變量的“指針。低地址高地址2000200220043000ijk000000110000000000000101000000000000100000000000ip2000假設(shè)一個(gè)變量專門(mén)用來(lái)
5、存放另一個(gè)變量的地址,那么稱它為“指針變量。指針變量的值即指針變量中存放的值是指針地址。留意區(qū)分“指針和“指針變量這兩個(gè)概念。四、闡明四、闡明、程序中定義的每個(gè)變量在編譯后都占有各自的內(nèi)存單元,系統(tǒng)是經(jīng)過(guò)內(nèi)存地址對(duì)變量進(jìn)展存取的;、數(shù)據(jù)所占有的內(nèi)存單元個(gè)數(shù)是由其數(shù)據(jù)類型決議的;、首地址:即第一個(gè)單元的地址;、表示地址的數(shù)與整數(shù)的區(qū)別;、變量i、j的地址能夠相鄰,也能夠不相鄰,是由系統(tǒng)分配的,我們不用關(guān)懷。10.2 指針變量的定義和援用10.2.1 概述1 1、指針運(yùn)算符:、指針運(yùn)算符:* *為了表示指針變量和它所指向的變量之間的聯(lián)絡(luò),用“*表示指向的關(guān)系。如:ip代表指針變量,*ip表示ip所
6、指向的變量。即*ip也代表一個(gè)變量。 例:、假設(shè):ip=&i;i=5;*ip=5;結(jié)論:*ip與i等價(jià)。、x=i+1;x=*ip+1;2 2、取地址運(yùn)算符:、取地址運(yùn)算符:& &它與一個(gè)變量連用,以得到該變量的內(nèi)存地址。3 3、闡明:、闡明:、取地址運(yùn)算符只能作用于變量:&x, &a5;不能作用于常量、表達(dá)式或存放器變量:&25, &(i+1);、不能把整數(shù)賦值給一個(gè)指針變量:ip=3000;、不能把一個(gè)指針變量的值賦值給一個(gè)整型變量:x=ip;10.2.2 指針變量的定義與賦值一、指針變量的定義一、指針變量的定義1、格式:類型名 *指針變量名其中:、“*表示定義的是指針變量;、“類型名用來(lái)指
7、定該指針變量可以指向的變量的類型;2、例:int i, *ip;int *p1, *p2;float x, *xp;char *cp1, *cp2;3、闡明:、“*只表示定義的變量為指針變量,但指針變量名中并不包含“*;*是指針變量的標(biāo)志,不可丟掉;、指針變量定義時(shí),指定了它所指向的變量的數(shù)據(jù)類型;ip=&i;p1=&i;xp=&i; cp1=&x;xp=&x;指針變量定義時(shí)必需指定其所指向的變量的數(shù)據(jù)類型,而且運(yùn)用過(guò)程中只能指向同一種類型的變量。、指針變量定義后,系統(tǒng)為變量分配一個(gè)存儲(chǔ)單元,用來(lái)存放地址。、指針變量定義后,假設(shè)不賦值,其值是不確定的。二、指針變量的賦值二、指針變量的賦值1、賦
8、值語(yǔ)句:int i, j, *p1, *p2;p1=&i; p2=&j;char ch, *cp1, *cp2;cp1=&ch; cp2=&ch;2、初始化:int x=4;int x;x=4int i, *p1=&i;int i, *p1;p1=&i;3、闡明:、指針變量定義后,假設(shè)不賦值,其值是不確定的;、可以給指針變量賦空值(NULL),使指針變量不指向任何變量;、指針變量的值為空值(NULL)與未對(duì)指針變量賦值,意義不同;、只能是同類型變量的地址進(jìn)展賦值;int i, *ip;char ch, *cp;ip=&i;cp=&ch;ip=&ch;cp=&i;、可以將數(shù)組名賦給某些類型的指針
9、變量;int a10, *ip; ip=&a0;ip=a;、不能將一個(gè)整型量(或任何其它非地址類型的數(shù)據(jù))賦給一個(gè)指針變量;int *ip;ip=3000;4、分析有關(guān)指針的程序時(shí),畫(huà)圖是很好的方法:假設(shè)有:int i, *p;p=&i;i=5;int i, *p;不定i不定pp=&i;&ii=5;510.2.3 指針變量的援用int a, *p1, *p2;p1=&a;printf(“%x, p1); p1?p2=p1;*p1=3;printf(%d, *p1);int a, *p1, *p2;不定a不定p1不定p2p1=&a;&aprintf(%x, p1);p2=p1;&a*p1=3;3
10、printf(%d, *p1);1、兩個(gè)運(yùn)算符:&和*&:取地址運(yùn)算符;*:指針運(yùn)算符(間接訪問(wèn)符);2、闡明:、&既可作用于普通變量,也可作用于指針變量;、*只能作用于指針變量;、表達(dá)式中的*p與變量定義中的*p含義不同;int i, *p=&i;*p=5; int a, *p=&a;int a, *p;p=&a;int a, *p;*p=&a;3、指針變量可以進(jìn)展的操作:int a, *p1, *p2;、賦值: p1=&a;p2=p1;、輸出:printf(%x, p1);、取內(nèi)容:*p1=5;a=5;printf(%d, *p1);、增減:p1+;p2-;p1+=4; (只能和一個(gè)整數(shù)只
11、能和一個(gè)整數(shù))例10.1#include main( ) int a1=11, a2=22; int *p1, *p2; p1=&a1; p2=&a2; printf(%d, %dn, *p1, *p2); p2=p1; printf(%d, %dn, *p1, *p2);11a122a2不定p1不定p2&a1&a2*p1*p2&a1*p2*p2多個(gè)指針可以指向同一個(gè)存儲(chǔ)單元。但在某一時(shí)辰,一個(gè)指針變量只能指向一個(gè)存儲(chǔ)單元,由于指針變量在某一時(shí)辰只能存放一個(gè)變量的地址值。例10.2#include void main( ) int a1=11, a2=22; int *p1, *p2, *p;
12、 p1=&a1; p2=&a2; printf(%d, %dn, *p1, *p2); p=p1; p1=p2; p2=p; printf(%d, %dn, *p1, *p2);11a122a2不定p1不定p2不定p&a1&a2*p1*p2&a1&a2*p1*p1&a1*p2*p2例10.3#include main( ) int a1=11, a2=22, t; int *p1, *p2; p1=&a1; p2=&a2; printf(%d, %dn, a1, a2); t=*p1; *p1=*p2; *p2=t; printf(%d, %dn, a1, a2);11a122a2不定t不定p
13、1不定p2&a1*p1&a2*p2112211、將變量的地址賦給指針變量(p1=&a1)、將一個(gè)指針變量賦給另一個(gè)指針變量(p2=p1)、經(jīng)過(guò)指針變量間接訪問(wèn)它所指向的變量(*p1)4、*和&運(yùn)算符的進(jìn)一步闡明:、假設(shè)有:p1=&a; 那么*p1等價(jià)于a;&*p1&(*p1)&a、 *&a*(&a)*pa、(*p)+等價(jià)于:a+不同于:*p+*p+*(p+)10.2.4 指針作為函數(shù)參數(shù)標(biāo)題:輸入兩個(gè)整數(shù)a、b,按大小順序輸出。#include swap(int x, int y) int temp; temp=x; x=y; y=temp; main( ) int a, b; printf(
14、nInput a, b: ); scanf(%d%d, &a, &b); if (ab) swap(a, b); printf(max=%d, min=%dn, a, b);留意:言語(yǔ)中的函數(shù)調(diào)用采用“傳值方式,即單向傳送方式。#include swap(int *px, int *py) int temp; temp=*px; *px=*py; *py=temp;void main( ) int a, b, *p1, *p2; printf(nInput a, b: ); scanf(%d%d, &a, &b); p1=&a; p2=&b; if (ab) swap(p1, p2); pri
15、ntf(max=%d, min=%dn, a, b);5a8b&ap1&bp2不定px不定py&a&b858a5b&ap1&bp2#include void swap(int *px, int *py) int *temp; *temp=*px; *px=*py; *py=*temp;void main( ) int a, b, *p1, *p2; printf(nInput a, b: ); scanf(%d%d, &a, &b); p1=&a; p2=&b; if (ab) swap(p1, p2); printf(max=%d, min=%dn, a, b);*temp是指針變量是指針變
16、量temp所指向的變量,但所指向的變量,但temp中并中并無(wú)確定的地址值,其值不確定無(wú)確定的地址值,其值不確定;*temp所指向的單元也不確所指向的單元也不確定。因此,對(duì)定。因此,對(duì)*temp賦值能夠賦值能夠會(huì)破壞系統(tǒng)的正常任務(wù)情況。會(huì)破壞系統(tǒng)的正常任務(wù)情況。應(yīng)該將*px的值賦給一個(gè)整型變量,用整型變量作為暫時(shí)存儲(chǔ)空間實(shí)現(xiàn)*px和*py的交換。#include void swap(int *px, int *py) int *p; p=px; px=py; py=p;void main( ) int a, b, *p1, *p2; printf(nInput a, b: ); scanf(%d
17、%d, &a, &b); p1=&a; p2=&b; if (ab) swap(p1, p2); printf(max=%d, min=%dn, a, b);5a8b&ap1&bp2不定px不定py&a&b&b&a5a8b&ap1&bp2、在主調(diào)函數(shù)中設(shè)n個(gè)變量;、將n變量的地址作為實(shí)參傳給所調(diào)用的函數(shù)的形參;、經(jīng)過(guò)形參指針變量,改動(dòng)該n個(gè)變量的值;、主調(diào)函數(shù)就可以運(yùn)用這些改動(dòng)了的值;10.3 指針與數(shù)組10.3.1 指向數(shù)組元素的指針變量1、幾個(gè)概念、一個(gè)變量有地址,稱變量的地址為該變量的指針;、每個(gè)數(shù)組都有一個(gè)起始地址,數(shù)組的起始地址稱為數(shù)組的指針;、一個(gè)數(shù)組包含假設(shè)干元素,每個(gè)數(shù)組元素都
18、在內(nèi)存中占用一定的存儲(chǔ)單元,即都有相應(yīng)的地址,數(shù)組元素的地址稱為數(shù)組元素的指針;、指針變量可以指向變量,當(dāng)然也可以指向數(shù)組和數(shù)組元素;、數(shù)組元素的指針變量就是專門(mén)用來(lái)存放數(shù)組元素地址的變量。2、定義:類型名 *指針變量名int a10;int *p;int a10, *p;a0a1a2a3a4a5a6a7a8a9不定p3、賦值:p=&a0;&a04、闡明:、言語(yǔ)中的數(shù)組名代表數(shù)組首地址,即第0號(hào)元素的地址;p=&a0;p=a;、定義時(shí)可以進(jìn)展初始化:int *p=&a0;int *p;p=&a0;int *p;*p=&a0;int *p=a;10.3.2 經(jīng)過(guò)指針訪問(wèn)一維數(shù)組1、數(shù)組元素的援用
19、:int a10, *p;p=a;*p=5;a0=5;p=&a3;*p=5;a3=5;2、言語(yǔ)規(guī)定:無(wú)論數(shù)組的數(shù)據(jù)類型如何,假設(shè)指針變量p已指向數(shù)組中的某一元素,那么p+1指向同一數(shù)組中的下一個(gè)元素而不是將p簡(jiǎn)單的加1例如:、int x10, *p=x;對(duì)于指向整型數(shù)組的指針變量p,p+1意味著使p在原值的根底上加2個(gè)字節(jié),以使它指向下一元素;、float x10, *p=x;對(duì)于指向float型數(shù)組的指針變量p,p+1意味著使p在原值的根底上加4個(gè)字節(jié),以使它指向下一元素;3、在運(yùn)用指針變量援用數(shù)組時(shí),應(yīng)留意以下問(wèn)題:、給指針賦初值的方法:p=a; 或p=&a0;、p+1或a+1實(shí)踐上表示數(shù)
20、組元素a1的地址(&a1);那么p+i或a+i表示數(shù)組的第i個(gè)元素的地址(&ai);、*(p+i)或*(a+i)表示p+i或a+i所指向的數(shù)組元素,即ai;、指向數(shù)組的指針變量也可以帶下標(biāo);如:pi與*(p+i)等價(jià);、假設(shè)p曾經(jīng)指向某個(gè)數(shù)組元素ai,那么p+j表示指向數(shù)組元素ai+j;綜上,可以用兩種方法來(lái)援用一個(gè)數(shù)組元素:、下標(biāo)法:用ai或pi來(lái)援用數(shù)組a中的第i號(hào)元素;、指針?lè)ǎ河?(p+i)或*(a+i)來(lái)援用數(shù)組中的第i號(hào)元素;可見(jiàn):任何由數(shù)組下標(biāo)完成的操作都能由指針來(lái)實(shí)現(xiàn);ai*(p+i)&aip+i4、在運(yùn)用指針變量時(shí),要留意以下幾個(gè)問(wèn)題:、可以運(yùn)用p+使指針變量p的值不斷改動(dòng):
21、for (p=a; p(a+10); p+) printf(%4d, *p);、在程序運(yùn)轉(zhuǎn)期間,要一直留意指針變量當(dāng)前所指向的是哪一個(gè)元素;、留意指針變量的運(yùn)算:假設(shè)p指向數(shù)組的開(kāi)場(chǎng),即:p=a;、p+; 使p指向下一元素,即a1;、*p+; 等價(jià)于*(p+);for (i=0,p=a; i10; i+) printf(%4d, *p+);、留意*(p+)與*(+p)的區(qū)別;、(*p)+表示p所指向的元素值加1;、假設(shè)指針變量指向數(shù)組的第i號(hào)元素,那么:*(p-)相當(dāng)于ai-*(-p)相當(dāng)于a-i*(+p)相當(dāng)于a+i10.3.3 經(jīng)過(guò)指針在函數(shù)間傳送一維數(shù)組1、數(shù)組元素作為函數(shù)參數(shù):swap
22、(int x, int y);swap(a1, a2);2、數(shù)組名作為函數(shù)參數(shù): f(int x , int n);f(a, 10);數(shù)組名代表數(shù)組首地址。用數(shù)組名作實(shí)參數(shù)組名代表數(shù)組首地址。用數(shù)組名作實(shí)參,調(diào)用函數(shù)時(shí)是把數(shù)組首地址傳送給形參,而,調(diào)用函數(shù)時(shí)是把數(shù)組首地址傳送給形參,而不是把數(shù)組的值傳給形參。不是把數(shù)組的值傳給形參。a0a1a2a3a4a5a6a7a8a9x0 x1x2x3x4x5x6x7x8x9實(shí)踐上可以接受并存放地址值的只能是指針變量,編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來(lái)處置的。xi*(x+i)假設(shè)在函數(shù)調(diào)用期間改動(dòng)了數(shù)組某一存儲(chǔ)單元的內(nèi)容,那么在函數(shù)調(diào)用終了后,已改動(dòng)的
23、值被保管下來(lái)。變量名與數(shù)組名作函數(shù)參數(shù)時(shí)的比較:變量名變量的值不能數(shù)組名或指針變量數(shù)組的起始地址能3、指針變量可替代數(shù)組名作為函數(shù)的參數(shù):、指針變量可以作為函數(shù)的形參;、指針變量可以作為函數(shù)的實(shí)參;例例 運(yùn)用指向數(shù)組的指針變量來(lái)援用數(shù)組元素運(yùn)用指向數(shù)組的指針變量來(lái)援用數(shù)組元素。main() int a10, *p=a, i; for(i=0; i10; i+) scanf(“%d, p+i); /*運(yùn)用指針變量來(lái)輸運(yùn)用指針變量來(lái)輸入數(shù)入數(shù) 組元素的值組元素的值*/ for(i=0; i10; i+) printf(“%d , *(p+i); /*運(yùn)用指向數(shù)組運(yùn)用指向數(shù)組的指針變的指針變 量輸出
24、數(shù)量輸出數(shù)組組*/ printf(“n); 程序闡明:程序闡明:程序中的程序中的2個(gè)個(gè)for語(yǔ)句,等價(jià)于下面的程序段:語(yǔ)句,等價(jià)于下面的程序段:for(i=0; i10; i+,p+) scanf(“%d,p);p=a; /*使使p重新指向數(shù)組的第一個(gè)元素重新指向數(shù)組的第一個(gè)元素*/for(i=0; i10; i+,p+) printf(“%d,*p);思索題:思索題:1假設(shè)去掉假設(shè)去掉“p=a;行,程序運(yùn)轉(zhuǎn)結(jié)果會(huì)如何?請(qǐng)上行,程序運(yùn)轉(zhuǎn)結(jié)果會(huì)如何?請(qǐng)上機(jī)驗(yàn)證。機(jī)驗(yàn)證。2在本例中,也可以不運(yùn)用在本例中,也可以不運(yùn)用i來(lái)作循環(huán)控制變量,程來(lái)作循環(huán)控制變量,程序怎樣修正?提示:指針可以參與關(guān)系運(yùn)算?
25、序怎樣修正?提示:指針可以參與關(guān)系運(yùn)算?endvoid sort(float b, int n) int i, j; float t; for(i=0; in-1; i+) for(j=i+1; jn; j+) if(bibj)t=bi; bi=bj; bj=t; 例例 將將n個(gè)數(shù)按從大到小排序個(gè)數(shù)按從大到小排序 main( ) int i; float a10; for(i=0; i10; i+) scanf(“%f, &ai); sort(a, 10); for(i=0; i10; i+) printf(“%f, , ai); printf(“n); 主函數(shù)不變,主函數(shù)不變,sort 函數(shù)
26、變?yōu)椋汉瘮?shù)變?yōu)椋?void sort(float *p, int n) int i, j; float t; for(i=0; in-1; i+) for(j=i+1; jn; j+) if( *(p+i) *(p+j) )t= *(p+i); *(p+i)=*(p+j);*(p+j)=t; main( ) int i; float *p, a10; p=a; for(i=0; i10; i+)scanf(“%f, p+); p=a; sort(p, 10); for(i=0; i10; i+) printf(“%f, , *p+); sort 函數(shù)不變、主函數(shù)變?yōu)椋汉瘮?shù)不變、主函數(shù)變?yōu)椋簹w納
27、起來(lái),實(shí)參與形參的對(duì)應(yīng)關(guān)系有:、形參和實(shí)參都用數(shù)組名:f(int x , int n);f(a, 10);、實(shí)參用數(shù)組名,形參用指針變量:f(int *x, int n);f(a, 10);、形參和實(shí)參都用指針變量:f(int *x, int n);f(p, 10);、實(shí)參為指針變量,形參為數(shù)組名:f(int x , int n);f(p, 10);小結(jié)p為指向數(shù)組元素的指針言語(yǔ)規(guī)定:數(shù)組名表示數(shù)組的首地址,即第言語(yǔ)規(guī)定:數(shù)組名表示數(shù)組的首地址,即第0個(gè)元素個(gè)元素的地址;即數(shù)組名是指向數(shù)組第的地址;即數(shù)組名是指向數(shù)組第0個(gè)元素的指針常量。個(gè)元素的指針常量。表示數(shù)組第 i 個(gè)元素的地址(&ai)
28、,即指向第 i 個(gè)元素的指針表示數(shù)組的第 i 個(gè)元素(ai)表示數(shù)組的第 i 個(gè)元素(ai)數(shù)組第 i 個(gè)元素地址的表示方法: &ai, a+i, p+i, &pi數(shù)組第 i 個(gè)元素的表示方法: ai, *(a+i), *(p+i), pi可以執(zhí)行p+等操作使p指向不同的數(shù)組元素,經(jīng)過(guò)*p訪問(wèn)不同的數(shù)組元素。但要一直留意p當(dāng)前所指向的是哪一個(gè)數(shù)組元素!編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來(lái)處置的。編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來(lái)處置的。f(int x , int n);f(int *x, int n);可以經(jīng)過(guò)xi、*(x+i)來(lái)訪問(wèn)實(shí)參數(shù)組元素。要?jiǎng)?wù)虛參為指向數(shù)組首元素的指針:要?jiǎng)?wù)虛參
29、為指向數(shù)組首元素的指針: a 或或 pf(a, 10);f(p, 10);(p=a;)10.3.4 多維數(shù)組與指針多維數(shù)組與指針1、二維數(shù)組的地址、二維數(shù)組的地址設(shè)數(shù)組定義為:設(shè)數(shù)組定義為:a34a0 a00, a01, a02, a03 a1 a10, a11, a12, a13 a2 a20, a21, a22, a23 視視 a為一維數(shù)為一維數(shù)組名,組名,ai 為為 a 數(shù)組元素?cái)?shù)組元素視視 ai 為一維數(shù)為一維數(shù)組名,組名,aij 為為 ai 數(shù)組元素?cái)?shù)組元素a001a013a025a037a109a1111a1213a1315a2017a2119a2221a2323可以以為a是具有3
30、個(gè)元素的一維數(shù)組:a0、a1、a2;a0a1a2每個(gè)元素又是具有4個(gè)整型元素的一維數(shù)組。2、數(shù)組名a表示地址2000120023200452006720219202111202113202115202117202119202021202223a0a1a2從二維數(shù)組的角度來(lái)看,a為二維數(shù)組名,表示整個(gè)二維數(shù)組的首地址。假設(shè)把a(bǔ)看成一維數(shù)組,每個(gè)數(shù)組元素a0、a1、a2占_個(gè)字節(jié)。a表示a0的地址(&a0: 2000);a+1表示的地址();a+1&a1a+2表示的地址();a+2&a2a+1表示:a+81=2021a+2表示:a+82=2021a+i表示:a+8ia+i表示ai的地址&ai,即第
31、i行的地址,它是指向一維數(shù)組的指針。3、ai表示地址a001a013a025a037a109a1111a1213a1315a2017a2119a2221a2323a0a1a2a0、a1、a2是一維數(shù)組名。a0是一維數(shù)組a0的首地址,即第0行一維數(shù)組中第0列元素的地址(&a00);即a0的值為&a00;a1是一維數(shù)組a1的首地址,即第1行一維數(shù)組中第0列元素的地址(&a10);即a1的值為&a10;a2是一維數(shù)組a2的首地址,即第2行一維數(shù)組中第0列元素的地址(&a20);即a2的值為&a20;因此,ai是第i行首元素的地址(指針),它是指向數(shù)組元素的指針。4、ai+j表示地址:a0+1表示第0
32、行第1列元素的地址; &a01a0+2表示第0行第2列元素的地址; &a02a2+3表示第2行第3列元素的地址; &a235、*(a+i)表示地址:*(a+i)等價(jià)于ai6、*(a+i)+j表示地址:*(a+i)+j等價(jià)于ai+j7、數(shù)組元素aij的表示:ai+j*(a+i)+j*(a+i) j假設(shè)i=0,a0j可表示為:假設(shè)j=0,ai0可表示為:aij8、(a+i)與*(a+i)的比較:(a+i)等價(jià)于等價(jià)于&ai*(a+i)等價(jià)于等價(jià)于ai、都表示地址:a+i表示第i行的地址(指針),*(a+i)表示第i行首元素的地址、它們指向的數(shù)據(jù)類型不同:a+i指向一個(gè)一維數(shù)組(二維數(shù)組的一行、行指
33、針);*(a+i)指向數(shù)組元素;假設(shè)進(jìn)展操作:(a+i)+1:使指針挪動(dòng)一維數(shù)組所占字節(jié)總數(shù)(一行、8字節(jié))*(a+i)+1:使指針挪動(dòng)一個(gè)數(shù)組元素所占內(nèi)存字節(jié)總數(shù)(2字節(jié))9、對(duì)ai性質(zhì)的進(jìn)一步闡明:ai從方式上看是a數(shù)組中第i個(gè)元素。假設(shè)a是一維數(shù)組名,那么ai代表a數(shù)組第i個(gè)元素所占的內(nèi)存單元。ai是有物理地址的,占內(nèi)存單元。假設(shè)a是二維數(shù)組,那么ai代表一維數(shù)組名。ai本身并不占實(shí)踐的內(nèi)存單元,它也不存放a數(shù)組中各個(gè)元素的值;它只是一個(gè)地址。a、a+i、ai、*(a+i)、*(a+i)+j、ai+j都是地址,*(ai+j)、*(*(a+i)+j)是二維數(shù)組元素aij的值。10、關(guān)于&a
34、i的闡明:、不要把&ai簡(jiǎn)單的了解為ai單元的物理地址,由于并不存在ai這個(gè)變量。它只是一種地址的計(jì)算方法,能得到第i行的首地址;、&ai和ai的值是一樣的,但它們的含義不同:&ai或a+i指向行,而ai或*(a+i)指向列。當(dāng)列下標(biāo)j為0時(shí),&ai和ai(即ai+j)值相等,即指向同一位置。、*(a+i)只是ai的另一種表示方式,不要簡(jiǎn)單的以為是“a+i所指單元的內(nèi)容。對(duì)于二維數(shù)組:對(duì)于二維數(shù)組:a+i=ai=*(a+i)=&ai=&ai0,它們的地址相等。它們的地址相等。2、多維數(shù)組的指針及指針變量、多維數(shù)組的指針及指針變量1指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量 設(shè)二維數(shù)組設(shè)二維數(shù)
35、組 anm假設(shè)指針變量假設(shè)指針變量 p=a那么指向那么指向 aij 的指針為的指針為 p+i*m+j即:即: *(p+i*m+j)=aij2指向一維數(shù)組的指針變量指向一維數(shù)組的指針變量 使指針變量指向二維數(shù)組的每一行使指針變量指向二維數(shù)組的每一行假設(shè)假設(shè) p 指向指向 a0,那么,那么 p+1 指向指向 a1;即:即:p 的增值以一維數(shù)組長(zhǎng)度為單位的增值以一維數(shù)組長(zhǎng)度為單位稱稱 p 為行指針為行指針 main( ) static int a34= ., ., . ; int *p, i, j; p=a;1) for(i=0; i12; i+) printf(“%d,*p+);2) for(i=
36、0; i12; i+) printf(“%d,*(*a+i);3) for(p=a0; pa0+12; p+) printf(“%d,*p);4) for(i=0; i3; i+) for(j=0; j4; j+) printf(“%d,*(p+i*4+j);例:輸出二維數(shù)組有關(guān)的值。例:輸出二維數(shù)組有關(guān)的值。10.4 字符串與指針10.4.1 經(jīng)過(guò)指針訪問(wèn)字符串一、有關(guān)概念:1、字符串的指針: 對(duì)應(yīng)的字符數(shù)組在內(nèi)存中存放的首地址;2、指向字符串的指針變量: 專門(mén)用來(lái)存放字符數(shù)組首地址的變量;3、字符數(shù)組指針變量的定義與賦值:char *p, str30;p=str;p=&str0;二、字符串
37、的表示方式:1、用字符數(shù)組實(shí)現(xiàn):void main( ) char s =I love China!; printf(%sn, s);2、用字符指針指向一個(gè)字符串: char s =I love China!;char *p;p=str;printf(%sn, p);對(duì)于指向字符的指針變量,除了可以把字符數(shù)組名(指向字符的指針常量)賦給它外,還可以將一個(gè)字符串常量賦給它。也可以在定義時(shí)賦初值:言語(yǔ)在處置字符串常量時(shí),在內(nèi)存中開(kāi)辟延續(xù)的存儲(chǔ)單元,存放字符串中的各字符和字符串終了標(biāo)志0。對(duì)指針變量賦值的作用是:將字符串在內(nèi)存中的首地址賦給指針變量。不同于用字符串常量對(duì)字符數(shù)組賦初值:其作用是:將字符串中的各字符和終了標(biāo)志0存放到數(shù)組ca的各元素中,數(shù)組的首地址用數(shù)組名ca表示。例:將字符數(shù)組a中的字符串復(fù)制到字符數(shù)組b中。、下標(biāo)法:#include main( ) char a =Hello, World!, b20; int i; for (i=0; ai!=0; i+) bi=ai; bi=0; printf(%sn, b);、指針?lè)ǎ?include void main( ) char a =Hello, World!, b20; char *pa=a, *pb=b; for ( ; *pa!=0; pa+, pb+) *pb=*pa;
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度旅游行業(yè)導(dǎo)游聘用勞動(dòng)合同
- 大連市2025年度租賃房屋合同解除通知
- 二零二五年度海洋漁業(yè)資源海域使用權(quán)租賃與資源保護(hù)協(xié)議
- 二零二五年度交通基礎(chǔ)設(shè)施建設(shè)債權(quán)轉(zhuǎn)讓與高速公路項(xiàng)目合同
- 出讓買(mǎi)房合同范本
- 科技時(shí)代下的大學(xué)生勞動(dòng)教育與自我發(fā)展
- 2025至2030年中國(guó)硅膠干燥劑數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 現(xiàn)代職場(chǎng)心理與應(yīng)對(duì)策略分享
- 貨物設(shè)備采購(gòu)合同范本
- 底漆采購(gòu)合同范本
- 全國(guó)青少年機(jī)器人技術(shù)等級(jí)考試二級(jí)第一課-直升機(jī)課件
- 數(shù)學(xué)原來(lái)可以這樣學(xué):小學(xué)篇
- 建設(shè)用地報(bào)批服務(wù)投標(biāo)方案(技術(shù)方案)
- 史賽克關(guān)節(jié)鏡系統(tǒng)
- 大豆玉米帶狀復(fù)合種植技術(shù)
- 2024屆高考語(yǔ)文一輪復(fù)習(xí):現(xiàn)代詩(shī)歌 專練(含答案)
- 初中生物學(xué)七年級(jí)下冊(cè)第四單元《生物圈中的人》 單元作業(yè)設(shè)計(jì)
- 《公路橋涵養(yǎng)護(hù)規(guī)范》(5120-2021)【可編輯】
- 2023年中國(guó)(安徽)大學(xué)生茶文化創(chuàng)新大賽試題庫(kù)
- 鋰離子電池簡(jiǎn)介課件
- 音樂(lè)劇《貓》賞析分析課件
評(píng)論
0/150
提交評(píng)論