C語言程序設(shè)計課件-第6章 指 針_第1頁
C語言程序設(shè)計課件-第6章 指 針_第2頁
C語言程序設(shè)計課件-第6章 指 針_第3頁
C語言程序設(shè)計課件-第6章 指 針_第4頁
C語言程序設(shè)計課件-第6章 指 針_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章指針

6.1地址與指針內(nèi)存是計算機的一個重要組成部分,存放“正在”使用的數(shù)據(jù)和“正在”執(zhí)行的程序。內(nèi)存單元的基本單位是字節(jié)。為了方便對內(nèi)存的訪問,每一個內(nèi)存單元都有一個編號,這個編號就是內(nèi)存的地址。C程序中的每一個變量、每一個函數(shù),在內(nèi)存中都會對應一定的內(nèi)存單元。

00000002┇20002002┇┇3540圖6.1

內(nèi)存單元中存放的數(shù)據(jù)即為內(nèi)存單元中的內(nèi)容。如圖2000單元中存放的數(shù)據(jù)是35,2002單元中存放的數(shù)據(jù)是40。在C程序的聲明部分,需要對程序中用到的變量進行說明,如intx,y說明了兩個整型變量x和y。對于這些變量,C編譯程序在編譯時會在內(nèi)存中分配相應的內(nèi)存單元,x和y實際上就是內(nèi)存單元的符號地址。例如:在程序中如果有語句:

x=68;

y=x+3;

則計算機會在x單元中存入數(shù)據(jù)68,然后將x單元的數(shù)據(jù)68加上3后將結(jié)果71存入y單元。如圖6.2所示。00000002┇20002002┇┇68圖6.2xy71說明:①編譯程序會在內(nèi)存中選取空閑的單元分配給變量x和y,這里不妨假設(shè)x為2000單元,y為2002單元。②在ANSIC中,一個整型變量占兩個字節(jié)。C程序中的每一個函數(shù)經(jīng)過編譯后,生成的目標代碼在內(nèi)存中是連續(xù)存放的,函數(shù)目標代碼的起始地址稱作函數(shù)的首地址,也叫入口地址。在C語言中,函數(shù)名本身就代表著函數(shù)的入口地址。6.1.2指針1.指針在計算機中,對一個內(nèi)存單元的訪問是通過地址來實現(xiàn)的,地址“指向”需要操作的內(nèi)存單元。因此在C語言中,把地址形象地稱為指針。C語言中定義的變量在內(nèi)存中都對應一定的內(nèi)存單元,也就對應一個地址。變量對應的地址稱作變量的指針。所謂函數(shù)的指針就是函數(shù)的入口地址。2.指針變量在計算機中,地址也是用二進制數(shù)表示的,也是數(shù)據(jù)(如2001,2002),所以地址也可以存放在另一個變量中。用來存放指針數(shù)據(jù)的變量叫作指針變量。例如在某C程序中定義了一個變量a,假設(shè)a的地址是3005,可以定義一個變量pointer,用于存放a的地址3005。則pointer就是一個指針變量。既可以定義一個指針變量用來存放變量的地址,也可以定義一個指針變量用來存放函數(shù)的入口地址。用來存放變量地址的指針變量稱作指向變量的指針變量,簡稱指針變量;用來存放函數(shù)入口地址的指針變量稱作指向函數(shù)的指針變量。有了指向變量的指針變量的概念,對變量的訪問就可以間接進行。圖6.3是直接訪問和間接訪問的示意圖:直接訪問:利用變量名a將86送入存儲單元。

a=86間接訪問:利用指針變量pointer訪問變量a。

pointer=&a/*變量a的地址送指針變量pointer*/*pointer=86/*將86送入存儲單元*/圖6.3直接訪問和間接訪問的示意圖6.2指針變量6.2.1指針變量的定義

C語言規(guī)定程序中使用的變量必須先定義,指定其類型。編譯程序根據(jù)變量的類型分配內(nèi)存單元。指針變量是用來存放地址的,必須定義成“指針類型”。指針變量定義的形式為:基類型*指針變量名 “基類型”表示指針變量所指向的變量的類型, “*”表示定義的是指針變量。例如: int*pointer; 定義了一個指針變量pointer,指向整型變量,也就是說變量pointer只能用來存放整型變量的地址。再如: float*p1,*p2;定義了兩個指針變量p1和p2,它們是指向?qū)嵭妥兞康?,也就是說變量p1和p2只能用來存放實型變量的地址。6.2.2指針變量的使用

指針變量的使用包括給指針變量賦值(使指針指向某個變量)通過指針引用存儲單元(引用指針變量所指向的變量) 移動指針。1.指針變量的賦值可以給指針變量賦地址值,且地址值必須是基類型變量的。為此C語言提供了取地址運算符&,它的作用是取得變量所占用的存儲單元的首地址。例如,語句“inta,*pointer;”之后,可以有語句:

pointer=&a;目的是將變量a的地址值賦給指針變量pointer。

注意變量a的類型和指針變量pointer的基類型必須一致。下面的定義和語句是錯誤的:

floata; int*pointer pointer=&a;也可以在定義指針變量的同時對其初始化,例如:

inta; int*pointer=&a;也可以給指針變量賦空值NULL。例如:

p=NULL;NULL是在stdio.h頭文件中定義的預定義符,因此如果程 序中使用了NULL,應該在程序前出現(xiàn)預定義行: #definenull0。

NULL的代碼值為0,所以上述語句等價于:

P=0;

注意:這時指針p是一個“空”值,或者說它不指向任何內(nèi)存單元。2.通過指針訪問變量 可以使用指針訪問它所指向的變量。C語言提供了指針運算符*(也稱為間接訪問運算符),它的作用是通過指針變量間接訪問它所指向的變量?!纠?.1】通過指針變量訪問變量。main(){intx; /*定義整型變量x*/floaty;/*定義實型變量y*/int*px=&x;/*定義指向整型變量的指針變量px,并指向x*/float*py=&y;/*定義指向?qū)嵭妥兞康闹羔樧兞縫y,并指向y*/*px=20;/*通過指針變量px給變量x賦值*/*py=19.600;/*通過指針變量py給變量y賦值*/*px=*px/2;/*通過指針變量px訪問變量x*/y=y+10; printf("*px=%d,*py=%6.3f\n",*px,*py);printf("x=%d,y=%6.3f\n",x,y);}

間接訪問運算符(*)必須出現(xiàn)在運算對象的左邊,運算對象或者是地址或者是存放地址的指針變量。例如:

j=*(&i);表達式&i求出變量i的地址,間接訪問運算符*取出地址中存放的內(nèi)容,然后賦給變量j。 運算符*和&的優(yōu)先級相同,因此上例可以寫成:j=*&i?!纠?.2】輸入x和y并求和。請注意x、y和px、py的異同。main(){intx,y;int*px=&x,*py=&y;printf("usingx,y:\nenterx,y:");scanf("%d%d",&x,&y);printf("x=%d,y=%d,x+y=%d\n",x,y,x+y);printf("*px=%d,*py=%d,*px+*py=%d\n",*px,*py,*px+*py);printf("usingpx,py:\nenterx,y:");scanf("%d,%d",px,py);/*通過指針輸入x,y*/printf("x=%d,y=%d,x+y=%d\n",x,y,x+y);printf("*px=%d,*py=%d,*px+*py=%d\n",*px,*py,*px+*py);}【例6.3】注意&運算符和*運算符混合使用的情況。main(){intx=3,y=4,z,*px,*py;z=*&x;px=&x;py=&y;py=&*px;printf("x=%d,y=%d,z=%d\n",x,y,z);printf("*px=%d,*py=%d\n",*px,*py);}如圖所示:圖(a)是執(zhí)行了語句“px=&x;”和“py=&y;”時的情況,圖(b)是執(zhí)行了語句“py=&*px;”的情況??梢钥闯觯攬?zhí)行px=&x后,*px和*&x是相同的,都是和變量x等同的,&x表示取x的地址,再加上*表示取這個地址的內(nèi)容,即x的值,執(zhí)行z=*&x后,z取得x的值?!纠?.4】輸入a和b兩個整數(shù),按先大后小順序輸出。main(){inta=5,b=9,temp;if(a<b){temp=a;a=b;b=temp;}printf("\na=%d,b=%d",a,b);}程序運行結(jié)果如下:a=9,b=5

在這個程序中,當a<b時,a和b的內(nèi)容進行了交換?!纠?.5】重新編寫例6.4。main(){inta=5,b=9;int*pa=&a,*pb=&b,*p;if(a<b){p=pa;pa=pb;pb=p;}printf("\na=%d,b=%d",a,b);printf("\nmax=%d,min=%d",*pa,*pb);}程序運行結(jié)果如下:a=5,b=9max=9,min=5例6.5中的a和b的內(nèi)容并沒有交換,通過指針的交換實現(xiàn)了數(shù)據(jù)的先大后小輸出。交換前指針的情況如圖6.5(a),交換后的指針情況如圖6.5(b)。6.3一維數(shù)組的指針6.3.1指向數(shù)組的指針變量類似于指向簡單變量的指針。只要將數(shù)組的首地址(或數(shù)組名)賦給指針變量。inta[10];int*p;則語句:

p=&a[10];(或p=a;)稱p指針為指向數(shù)組a的指針變量。6.3.2一維數(shù)組的指針

指針變量既然可以指向變量,當然也可指向數(shù)組和數(shù)組元素。一維數(shù)組的指針是指數(shù)組在內(nèi)存中的起始地址,一維數(shù)組元素的指針是指數(shù)組元素在內(nèi)存中的起始地址。如果指針變量p就是指數(shù)組a的指針變量,則對數(shù)組的引用可以用以下訪問方式:a[i],p[i],*(a+i),*(p+i)等。(i為相應數(shù)組元素的下標)【例6.6】輸出數(shù)組元素的三種方法(1)通過數(shù)組名由于數(shù)組名就是數(shù)組的首地址,所以也可以通過數(shù)組名輸出數(shù)組元素。main(){inta[10],i;for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“\n”);for(i=0;i<10;i++)printf(“%d”,*(a+i));}(2)下標法main(){inta[10],i;for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“\n”);for(i=0;i<10;i++)printf(“%d”,a[i]);}(3)指針法main(){inta[10],*p,i;for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“\n”);for(p=a;p<(a+10);p++)printf(“%d”,*p);}【例6.7】輸入4個同學的成績并求平均成績.#include”stdio.h”main(){floatscore[4],*p,sum=0,aver;inti,j;printf(”Input4scores:\n”);for(i=0;i<4;i++)scanf(“%f”,&score[i]);p=score;for(j=0;j<4;j++)sum=sum+*(p+j);aver=sum/4.;printf(“aver=%5.2f\n”,aver);}6.4指針與字符串

6.4.1指向字符串的指針變量C語言對字符串常量是按字符數(shù)組處理的,在內(nèi)存中開辟了一個字符數(shù)組存放字符串常量,因此可以使用字符型指針變量指向字符串常量。例如:char*p=”Iamstudent”;或char*p;p=”Iamstudent”;

1.用數(shù)組實現(xiàn)對字符串的訪問【例6.8】#include”stdio.h”main(){chard[]=“Iam

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論