版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、為了說清楚什么是指針,必須弄清楚數(shù)據(jù)在內(nèi)存中為了說清楚什么是指針,必須弄清楚數(shù)據(jù)在內(nèi)存中是如何存儲的,又是如何讀取的。是如何存儲的,又是如何讀取的。 計算機中,所有的數(shù)據(jù)都是存放在存儲器的內(nèi)存計算機中,所有的數(shù)據(jù)都是存放在存儲器的內(nèi)存單元中的。一般把存儲器中一個字節(jié)稱為一個內(nèi)存單元中的。一般把存儲器中一個字節(jié)稱為一個內(nèi)存單元,不同數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等,如單元,不同數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等,如整型變量占整型變量占2個字節(jié),字符變量占個字節(jié),字符變量占1個字節(jié)等。個字節(jié)等。 為了正確地訪問這些內(nèi)存單元,必須為每個內(nèi)存為了正確地訪問這些內(nèi)存單元,必須為每個內(nèi)存單元編上號,根據(jù)一個內(nèi)存
2、單元的編號即可準(zhǔn)確地單元編上號,根據(jù)一個內(nèi)存單元的編號即可準(zhǔn)確地找到該內(nèi)存單元。找到該內(nèi)存單元。內(nèi)存單元的編號,稱為內(nèi)存單元的編號,稱為“地址地址” 。內(nèi)存單元的內(nèi)存單元的地址地址和內(nèi)存單元的和內(nèi)存單元的內(nèi)容內(nèi)容是兩個不同的概念:是兩個不同的概念:假設(shè)程序中定義了整型變量假設(shè)程序中定義了整型變量i,并賦值為,并賦值為3。編譯時系統(tǒng)。編譯時系統(tǒng)分配分配2000和和2001兩個字節(jié)給變量兩個字節(jié)給變量i,此時兩個內(nèi)存單元,此時兩個內(nèi)存單元的編號為單元的地址,其中存放的數(shù)據(jù)即是該單元的內(nèi)的編號為單元的地址,其中存放的數(shù)據(jù)即是該單元的內(nèi)容。容。兩種訪問方式:兩種訪問方式:直接訪問方式:直接訪問方式:在
3、程序中一般是通過變量名來對內(nèi)存單元進行存取操作在程序中一般是通過變量名來對內(nèi)存單元進行存取操作的,其實程序在編譯后,已經(jīng)將變量名轉(zhuǎn)換成變量的地的,其實程序在編譯后,已經(jīng)將變量名轉(zhuǎn)換成變量的地址,對變量值的存取都是通過地址進行的。址,對變量值的存取都是通過地址進行的。間接訪問方式:間接訪問方式: 將變量將變量i的地址存放在另一個變量中,的地址存放在另一個變量中,C語言規(guī)定,可語言規(guī)定,可以在程序中定義一種特殊的變量,用來存放地址。以在程序中定義一種特殊的變量,用來存放地址。假設(shè)定義一個變量假設(shè)定義一個變量p,用來存放整型變量的地址,它被,用來存放整型變量的地址,它被分配為分配為3010、3011
4、兩個字節(jié)。兩個字節(jié)??梢酝ㄟ^下面語句將可以通過下面語句將i的地址的地址(2000)存放到存放到p:p=&i; 對變量對變量i是訪問,可直接訪問,已知變量是訪問,可直接訪問,已知變量i的地址,根的地址,根據(jù)此地址直接對變量據(jù)此地址直接對變量i的存儲單元進行存取訪問;的存儲單元進行存取訪問; 也可間接訪問,先找到存放變量也可間接訪問,先找到存放變量i的地址的變量的地址的變量p,從,從其中得到變量其中得到變量i的地址,然后找到變量的地址,然后找到變量i的存儲單元,對的存儲單元,對它進行存取范圍。它進行存取范圍。 一個變量的地址稱為該變量的一個變量的地址稱為該變量的“指針指針”。如,地址。如,地址20
5、00是變量是變量i的指針。的指針。 C語言中,用一個變量存放指針語言中,用一個變量存放指針(地址地址),此變量稱為,此變量稱為指針變量指針變量,上述的變量,上述的變量p是指針變量,指針變量的值是是指針變量,指針變量的值是某個內(nèi)存單元某個內(nèi)存單元 的地址的地址(指針指針)。 嚴(yán)格地說,一個指針是一個地址,是一個常量;而一嚴(yán)格地說,一個指針是一個地址,是一個常量;而一個指針變量卻可以被賦予不同的指針值,是變量。但通個指針變量卻可以被賦予不同的指針值,是變量。但通常把指針變量簡稱指針。常把指針變量簡稱指針。指針變量的值不僅可以是變量的地址,也可以是其他數(shù)指針變量的值不僅可以是變量的地址,也可以是其他
6、數(shù)據(jù)結(jié)構(gòu)的地址。據(jù)結(jié)構(gòu)的地址。例如:在一個指針變量中可存放一個數(shù)組或一個函數(shù)的例如:在一個指針變量中可存放一個數(shù)組或一個函數(shù)的首地址。首地址。區(qū)別:區(qū)別:變量的指針變量的指針和和指針變量指針變量1.變量的指針就是變量的地址。變量的指針就是變量的地址。2.存放變量地址的變量是指針變量,它用來指向存放變量地址的變量是指針變量,它用來指向另一個變量。另一個變量。 為了表示指針變量和它所指向的變量之間的聯(lián)系,為了表示指針變量和它所指向的變量之間的聯(lián)系,在程序中用在程序中用“ * ”符號表示符號表示“指向指向”。 若已定義若已定義i_pointer為指針變量,則為指針變量,則* i_pointer是是i
7、_pointer所指向的變量,因此所指向的變量,因此* i_pointer也代表一個也代表一個變量,它和變量變量,它和變量i是同一回事。是同一回事。下面兩個語句作用相同:下面兩個語句作用相同:(1)i=3;(2) * i_pointer=3;第二個語句含義是將第二個語句含義是將3賦給指針賦給指針變量變量i_pointer所指向的變量所指向的變量i.一、一、 指針變量的定義指針變量的定義指針變量在使用前必須先定義,一般形式為:指針變量在使用前必須先定義,一般形式為: 類型說明符類型說明符 *指針變量名;指針變量名;其中,其中,*表示這是一個指針變量,表示這是一個指針變量,類型說明符類型說明符 表
8、示該指表示該指針變量所指變量的數(shù)據(jù)類型。針變量所指變量的數(shù)據(jù)類型。例如:例如:int *p1;(其中其中p1(而不是而不是 *p1)是一個指向整型變量的指針變量,是一個指向整型變量的指針變量,它的值是某個整型變量的地址。它的值是某個整型變量的地址。) float *p2;(其中其中p2是指向浮點型變量的指針變量是指向浮點型變量的指針變量)說明:說明:(1)指針變量名的構(gòu)成原則是標(biāo)識符,前面必須有指針變量名的構(gòu)成原則是標(biāo)識符,前面必須有“ * ” , 表示該變量的類型是指針型變量。表示該變量的類型是指針型變量。(2)在一個定義語句中,可以同時定義普通變量、數(shù)組、在一個定義語句中,可以同時定義普通
9、變量、數(shù)組、 指針變量。指針變量。(3)類型說明符說明的數(shù)據(jù)類型不是指針變量中存放的類型說明符說明的數(shù)據(jù)類型不是指針變量中存放的數(shù)據(jù)的數(shù)據(jù)類型,而是它數(shù)據(jù)的數(shù)據(jù)類型,而是它將要指向的變量或數(shù)組的數(shù)據(jù)將要指向的變量或數(shù)組的數(shù)據(jù)類型類型。因此,一個指針變量只能用來指向同種數(shù)據(jù)類型。因此,一個指針變量只能用來指向同種數(shù)據(jù)類型的其他變量或數(shù)組,不能時而指向一個浮點型變量,時的其他變量或數(shù)組,不能時而指向一個浮點型變量,時而指向一個整型變量。而指向一個整型變量。二、二、 指針變量的引用指針變量的引用 指針變量中只能存放變量的地址,絕不能存放任何指針變量中只能存放變量的地址,絕不能存放任何其他數(shù)據(jù)。其他數(shù)
10、據(jù)。例如:例如:int *p; p=2000; /*2000是一個整數(shù)而不是一個地址是一個整數(shù)而不是一個地址*/C語言提供兩種有關(guān)的運算符:語言提供兩種有關(guān)的運算符:(1)&:取地址運算符取地址運算符 (用來表示變量的地址用來表示變量的地址)(2)* :取內(nèi)容運算符取內(nèi)容運算符 (用來取其指向的內(nèi)容,或稱用來取其指向的內(nèi)容,或稱“間接間接 訪問訪問”運算符,或稱指針運算符運算符,或稱指針運算符)兩種運算符都是單目運算符,其結(jié)合性都為自右向左,兩種運算符都是單目運算符,其結(jié)合性都為自右向左,優(yōu)先級別相同。優(yōu)先級別相同。例如:例如:&a為變量為變量a的地址,的地址, *p為指針變量為指針變量p所指
11、向的內(nèi)存單元的內(nèi)容所指向的內(nèi)存單元的內(nèi)容 (即即p所指向的變量的值所指向的變量的值)。說明:說明:(1)設(shè)有指向整型變量的指針變量設(shè)有指向整型變量的指針變量p,若要把整型變量,若要把整型變量a的地址賦予的地址賦予p,有以下方式:,有以下方式: 指針變量初始化的方法:指針變量初始化的方法: int a; int *p=&a; 賦值語句的方法:賦值語句的方法: int a,*p; p=&a;(2)指針運算符指針運算符*和指針變量說明中的和指針變量說明中的指針說明符指針說明符*不是不是一回事。后者表示其后的變量是指針類型,前者則是一一回事。后者表示其后的變量是指針類型,前者則是一個運算符用以表示指針
12、變量所指的變量。個運算符用以表示指針變量所指的變量。說明:說明:(3)如果已執(zhí)行了語句如果已執(zhí)行了語句p=&a; ,則:,則: &*p:先進行:先進行*p的運算,即是變量的運算,即是變量a,再執(zhí)行,再執(zhí)行&運算運算, 即變量即變量a的地址。的地址。因此因此&*p與與&a相同。相同。 *&a:先進行:先進行&a的運算,即得的運算,即得a的地址,再執(zhí)行的地址,再執(zhí)行*運運 算算, 即即&a所指向的變量,即變量所指向的變量,即變量a。 因此因此*&a與與a相同。相同。#include void main( )int a,b; int *p1,*p2; a=100; b=10; p1=&a; p2=&
13、b; printf(“%d,%d n”,a,b); printf(“%d,%d n”,*p1,*p2);例例: : 通過指針變量訪問整型變量。通過指針變量訪問整型變量。 運行結(jié)果:運行結(jié)果:100,10100,10#include void main( )int a=5,b,c,*p; p=&a; b=*p; c=a+*p; printf(“%d,%d n”,b,c);例例: : 通過指針變量進行運算。通過指針變量進行運算。 運行結(jié)果:運行結(jié)果:5,10說明:說明:(1) 指針變量的運算種類也是有限的,它只能進行賦值指針變量的運算種類也是有限的,它只能進行賦值運算和部分算術(shù)運算及關(guān)系運算。運算
14、和部分算術(shù)運算及關(guān)系運算。(2) 指針變量還可以賦空值,其賦空值后,則可以使用,指針變量還可以賦空值,其賦空值后,則可以使用,只是它不指向具體的變量而已。只是它不指向具體的變量而已。 例如:例如:#define NULL 0 int *p=NULL;三、三、 指針變量作函數(shù)參數(shù)指針變量作函數(shù)參數(shù)#includeswap(int x,int y)int t; t=x; x=y; y=t;void main( )int a=3,b=5; if(ab) swap(a,b); printf(“a=%d,b=%d n”,a,b);C C語言是通過傳值將參數(shù)傳遞給函數(shù)的,對被調(diào)函數(shù)來說,語言是通過傳值將參
15、數(shù)傳遞給函數(shù)的,對被調(diào)函數(shù)來說,沒有直接的方法來改變主調(diào)函數(shù)內(nèi)的變量的值。沒有直接的方法來改變主調(diào)函數(shù)內(nèi)的變量的值。 例:對兩個整數(shù)按大小順序輸出。例:對兩個整數(shù)按大小順序輸出。運行結(jié)果:運行結(jié)果:a=3,b=5#includeswap(int *x,int *y)int t; t=*x; *x=*y; *y=t;void main( )int a=3,b=5; if(ab) swap(&a,&b); printf(“a=%d,b=%d n”,a,b);使主調(diào)函數(shù)傳遞指向要被改變量的指針,即可使被調(diào)函數(shù)使主調(diào)函數(shù)傳遞指向要被改變量的指針,即可使被調(diào)函數(shù)能改變主調(diào)函數(shù)的參數(shù)值。能改變主調(diào)函數(shù)的參
16、數(shù)值。例:對兩個整數(shù)按大小順序輸出。例:對兩個整數(shù)按大小順序輸出。運行結(jié)果:運行結(jié)果:a=5,b=3 一個數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的,數(shù)一個數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的,數(shù)組名即是這塊連續(xù)內(nèi)存單元的首地址。組名即是這塊連續(xù)內(nèi)存單元的首地址。 一個變量有地址,一個數(shù)組包含若干元素,每一個變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素也可以指向數(shù)組元素(把某一元素的地址放到一(把某一元素的地址放到一個指針變量中)。
17、所謂個指針變量中)。所謂數(shù)組元素的指針就是數(shù)組數(shù)組元素的指針就是數(shù)組元素的地址元素的地址。 指向數(shù)組的指針變量稱為指向數(shù)組的指針變量稱為數(shù)組指針變量數(shù)組指針變量。其一般形式為:其一般形式為:類型說明符類型說明符 * *指針變量名;指針變量名;其中,類型說明符表示所指數(shù)組的類型。從中可其中,類型說明符表示所指數(shù)組的類型。從中可以看出指向數(shù)組的指針變量和指向普通變量的指以看出指向數(shù)組的指針變量和指向普通變量的指針變量的說明是相同的。針變量的說明是相同的。一、指向數(shù)組元素的指針一、指向數(shù)組元素的指針說明:說明:設(shè)有實型數(shù)組設(shè)有實型數(shù)組a,指向,指向a的指針變量為的指針變量為pa,則有以下關(guān)系:,則有
18、以下關(guān)系:pa,a,&a0均指向同一內(nèi)存單元,它們是數(shù)組均指向同一內(nèi)存單元,它們是數(shù)組a的首的首地址,即是地址,即是a0的首地址;的首地址;pa+1,a+1,&a1均指向元素均指向元素a1的地址;的地址;pa+i,a+i,&ai均指向元素均指向元素ai的地址。的地址。*(pa+i),*(a+i)是是pa+i 或或a+i 所指向的數(shù)組元素,即所指向的數(shù)組元素,即ai注意:注意:pa是變量,是變量,a與與&ai都是常量都是常量(地址地址)。引入指針變量后,可以用兩種方法來訪問數(shù)組元素:引入指針變量后,可以用兩種方法來訪問數(shù)組元素:1.下標(biāo)法:采用下標(biāo)法:采用ai形式訪問數(shù)組元素:形式訪問數(shù)組元素:
19、2.指針法:采用指針法:采用*(pa+i)或或*(a+i)形式,用間接訪問的形式,用間接訪問的 方法來訪問數(shù)組元素,即通過指向數(shù)組元方法來訪問數(shù)組元素,即通過指向數(shù)組元 素的指針找到所需的元素。素的指針找到所需的元素。例例:(1)int a; (2)int a; 初始化賦值初始化賦值 int *p=&a0; int *p=a; (3)int a; (4)int a; 賦值語句賦值賦值語句賦值 int *p; int *p; p=&a0; p=a;按按C C語言的規(guī)定:如果指針語言的規(guī)定:如果指針p p已指向數(shù)組中的一個元素,已指向數(shù)組中的一個元素,則則p+1p+1指向同一數(shù)組中的下一個元素指向
20、同一數(shù)組中的下一個元素,而不是將,而不是將p p的值的值( (地址值地址值) )簡單地加簡單地加1 1。例如:例如:數(shù)組元素是數(shù)組元素是floatfloat型,每個元素占型,每個元素占4 4個字節(jié),則個字節(jié),則p+1p+1意味意味著使著使p p的值的值( (地址值地址值) )加加4 4個字節(jié),以使它指向下一個元個字節(jié),以使它指向下一個元素,此時,素,此時,p+1p+1所代表的地址實際上是所代表的地址實際上是p+1 dp+1 d,d d是一是一個數(shù)組元素所占的字節(jié)數(shù)。個數(shù)組元素所占的字節(jié)數(shù)。二、通過指針引用數(shù)組元素二、通過指針引用數(shù)組元素(1)下標(biāo)法下標(biāo)法 #include void main(
21、 )int a10,i; for(i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); for(i=0;i10;i+) printf(“%d”,ai); printf(“n”);例:輸出數(shù)組中的全部元素。例:輸出數(shù)組中的全部元素。( (設(shè)一個設(shè)一個a a數(shù)組,整型,有數(shù)組,整型,有1010個元素,要輸出各元素的值有個元素,要輸出各元素的值有3 3種方法種方法) )(2)通過數(shù)組名計算數(shù)組元素通過數(shù)組名計算數(shù)組元素 的地址,找出元素的值的地址,找出元素的值 for(i=0;i10;i+) printf(“%d”,*(a+i);(3)用指針變量指向數(shù)組元素用指針變量指
22、向數(shù)組元素 for(p=a;p(a+10);p+) printf(“%d”,*p);#include void main( )int a10,i,*p; p=a; for(i=0;i10;i+) scanf(“%d”,p+); printf(“n”); for(i=0;ipa表示表示qa處于高地址位置;處于高地址位置;pa處于低地址位置;處于低地址位置;#include void main( )int a5,i,*pa,*qa; pa=qa=a; for(i=0;i5;i+) *qa=i; qa+; /*將指針將指針qa指向指向a數(shù)組中的下一元素數(shù)組中的下一元素 */ for(i=0;paqa
23、;i+) printf(“a%d=%-2d”,i,*pa); pa+; 例:通過指針變量的運算輸出例:通過指針變量的運算輸出a a數(shù)組中的數(shù)組中的5 5個元素。個元素。運行結(jié)果:運行結(jié)果:a0=0 a1=1 a2=2 a3=3 a4=42.指針變量的自增自減運算指針變量的自增自減運算如果先使如果先使p指向數(shù)組指向數(shù)組a的首元素的首元素(即即p=a),請分析:,請分析:(1)p+:使:使p指向數(shù)組指向數(shù)組a的下一元素,即的下一元素,即a1。(2)*p+:由于元素符:由于元素符+和和*同優(yōu)先級,結(jié)合方向為自同優(yōu)先級,結(jié)合方向為自 右向左,因此它等價于右向左,因此它等價于*(p+)。(3)*(p+)
24、 與與*(+p)作用不同。作用不同。(4)(*p)+:表示:表示p所指向的元素值加所指向的元素值加1,它等價于,它等價于 (a0)+。若。若a0=3,則,則(*p)+的值為的值為4。 注意:是元素值加注意:是元素值加1,而不是指針值加,而不是指針值加1。前面已介紹過可以用數(shù)組名作函數(shù)的參數(shù),例如:前面已介紹過可以用數(shù)組名作函數(shù)的參數(shù),例如:void f(int arr ,int n) void main( ) int array10; f(array,10); f (int arr , int n)但在編譯時是將但在編譯時是將arr按指針變量處理的,相當(dāng)于將函數(shù)按指針變量處理的,相當(dāng)于將函數(shù)f的首部寫成的首部寫成f (int *arr, int n)以上兩種寫法是等價的。以上兩種寫法是等價的。三、用數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)三、用數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)以變量名和數(shù)組名、數(shù)組指針變量作為函數(shù)參數(shù)的以變量名和數(shù)組名、數(shù)組指針變量作為函數(shù)參數(shù)的比較:比較:實參類型變量名數(shù)組名要求形參的類型變量名數(shù)組名或指針變量傳遞的信息變量的值 實參數(shù)組的首地址通過函數(shù)調(diào)用能否改變實參的值不能能 歸納起來,如果有一個實參數(shù)組,想在函數(shù)中改變歸納起來,如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組中的元素的值,實參與形參的對應(yīng)關(guān)系有以下此數(shù)組中的元素的值,實參與形參
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 贛南醫(yī)學(xué)院《英語閱讀與思辨》2023-2024學(xué)年第一學(xué)期期末試卷
- 七年級語文上冊第二單元6散步教案新人教版
- 七年級道德與法治上冊第四單元生命的思考第八課探問生命第1課時誤區(qū)警示新人教版
- 三年級數(shù)學(xué)上冊7長方形和正方形第3課時周長導(dǎo)學(xué)案新人教版
- 三年級數(shù)學(xué)上冊第2單元兩三位數(shù)乘一位數(shù)2.8解決問題課時練冀教版
- 慢性胃炎培訓(xùn)課件
- 《先芥蒂與麻醉》課件
- 人教版八年級物理下冊全冊教案
- 函數(shù)的圖象課件
- 涂料調(diào)色完整版本
- 九月主題計劃《 嗨,你好》
- e乙二醇精制車間設(shè)備布置圖
- 縣級綜治中心等級評定細(xì)則、申報表、負(fù)面清單、流程圖
- 行政強制法講座-PPT課件
- 2022年新媒體編輯實戰(zhàn)教程測試題及答案(題庫)
- 崗位現(xiàn)場應(yīng)急處置方案卡全套(全套20頁)
- 涼席竹片銑槽機(課程設(shè)計)
- 高壓線防護搭設(shè)方案
- 綜合機械化固體充填采煤技術(shù)要求-編制說明
- 十人聯(lián)名推薦表
- 七、分蛋糕博弈
評論
0/150
提交評論