《C語言程序設(shè)計(jì)》課件第6章_第1頁
《C語言程序設(shè)計(jì)》課件第6章_第2頁
《C語言程序設(shè)計(jì)》課件第6章_第3頁
《C語言程序設(shè)計(jì)》課件第6章_第4頁
《C語言程序設(shè)計(jì)》課件第6章_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章指針6.1地址與指針

6.2指針變量

6.3一維數(shù)組的指針

6.4指針與字符串

6.1地?址?與?指?針

6.1.1地址

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

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

例如:在程序中如果有語句:

x=68;

y=x+3;

則計(jì)算機(jī)會在x單元中存入數(shù)據(jù)68,然后將x單元的數(shù)據(jù)68加上3后將結(jié)果71存入y單元。如圖6.2所示。圖6.2內(nèi)存的內(nèi)容說明:

(1)編譯程序會在內(nèi)存中選取空閑的單元分配給變量x和y,這里不妨假設(shè)x為2000單元,y為2002單元。

(2)在ANSIC中,一個整型變量占兩個字節(jié)。

C程序中的每一個函數(shù)經(jīng)過編譯后,生成的目標(biāo)代碼在內(nèi)存中是連續(xù)存放的,函數(shù)目標(biāo)代碼的起始地址稱作函數(shù)的首地址,也叫入口地址。

在C語言中,函數(shù)名代表著函數(shù)的入口地址。6.1.2指針

1.指針

在計(jì)算機(jī)中,對一個內(nèi)存單元的訪問是通過地址來實(shí)現(xiàn)的,即地址“指向”需要操作的內(nèi)存單元。因此在C語言中,把地址形象地稱為指針。

C語言中定義的變量在內(nèi)存中都對應(yīng)一定的內(nèi)存單元,也就是說對應(yīng)一個地址。變量對應(yīng)的地址稱作變量的指針。

所謂函數(shù)的指針就是函數(shù)的入口地址。

2.指針變量

在計(jì)算機(jī)中,地址也是用二進(jìn)制數(shù)表示的,地址本身也是數(shù)據(jù),所以地址也可以存放在另一個變量中。用來存放指針數(shù)據(jù)的變量叫做指針變量。

例如在某C程序中定義了一個變量a,假設(shè)a的地址是3005,可以定義一個變量pointer,用于存放a的地址3005。該pointer就是一個指針變量。

既可以定義一個指針變量用來存放變量的地址,也可以定義一個指針變量用來存放函數(shù)的入口地址。用來存放變量地址的指針變量稱為指向變量的指針變量,簡稱指針變量;用來存放函數(shù)入口地址的指針變量稱作指向函數(shù)的指針變量。有了指向變量的指針變量的概念,對變量的訪問就可以間接進(jìn)行。圖6.3是直接訪問和間接訪問的示意圖。圖6.3直接訪問和間接訪問的示意圖 6.2指針變量

6.2.1指針變量的定義

C語言規(guī)定程序中使用的變量必須先定義,指定其類型。編譯程序根據(jù)變量的類型分配內(nèi)存單元。指針變量是用來存放地址的,必須定義成“指針類型”。

指針變量定義的形式為

基類型*指針變量名

這里“基類型”表示指針變量所指向的變量的類型,“*”表示定義的是指針變量。例如:

int*pointer;定義了一個指針變量pointer,它是指向整型變量的,所以變量pointer只能用來存放整型變量的地址。再如:

float*p1,*p2;

定義了兩個指針變量p1和p2,它們是指向?qū)嵭妥兞康?,所以變量p1和p2只能用來存放實(shí)型變量的地址。6.2.2指針變量的使用

1.指針變量的賦值

可以給指針變量賦地址值,且地址值必須是基類型變量的。為此C語言提供了取地址運(yùn)算符&,它的作用是取得變量所占用的存儲單元的首地址。

例如,語句“inta,*pointer;”之后,可以有語句:

pointer=&a;

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

2.通過指針訪問變量

可以使用指針訪問它所指向的變量。C語言提供了指針運(yùn)算符(也稱為間接訪問運(yùn)算符),它的作用是通過指針變量間接訪問它所指向的變量。

【例6.1】

通過指針變量訪問變量。

程序如下:

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

j=*(&i);

表達(dá)式?&i求出變量i的地址,間接訪問運(yùn)算符*取出地址中存放的內(nèi)容,然后賦給變量j。

運(yùn)算符?*?和?&?的優(yōu)先級相同,因此上例可以寫成:j=*&i。圖6.4例6.1的執(zhí)行結(jié)果圖6.5例6.2的運(yùn)行結(jié)果程序說明:scanf("%d,%d",px,py);為x和y輸入時,在變量px、py前不再使用運(yùn)算符&。

【例6.3】

注意&運(yùn)算符和*運(yùn)算符混合使用的情況。

程序如下:程序的執(zhí)行結(jié)果如圖6.6所示。

如圖6.7所示:圖(a)是執(zhí)行了語句“px=&x;”和“py=&y;”時的情況,圖(b)是執(zhí)行了語句“py=&*px;”的情況??梢钥闯?,當(dāng)執(zhí)行px=&x后,*px和?*&x是相同的,都是和變量x等同的,&x表示取x的地址,再加上?*?表示取這個地址的內(nèi)容,即x的值,執(zhí)行z=*&x后,z取得x的值。圖6.6例6.3的運(yùn)行結(jié)果

圖6.7&和*混合使用圖6.8例6.4的運(yùn)行結(jié)果圖6.9例6.5的運(yùn)行結(jié)果程序說明:a和b的內(nèi)容并沒有交換,通過指針的交換實(shí)現(xiàn)了數(shù)據(jù)的先大后小輸出。交換前指針的情況如圖6.10(a),交換后的指針情況如圖6.10(b)。圖6.10指針交換前后的情況

6.3一維數(shù)組的指針

6.3.1指向數(shù)組的指針變量

類似于指向簡單變量的指針,只要將數(shù)組的首地址(或數(shù)組名)賦給指針變量,該指針就稱為指向數(shù)組的指針變量。例如:

inta[10];

int*p;

則語句:

p=&a[10];(或p=a;)

使p指針成為指向數(shù)組a的指針變量。6.3.2一維數(shù)組的指針

指針變量既然可以指向變量,當(dāng)然也可指向數(shù)組和數(shù)組元素。一維數(shù)組的指針指向數(shù)組在內(nèi)存中的起始地址,一維數(shù)組元素的指針指向數(shù)組元素在內(nèi)存中的起始地址。如果指針變量p就是指數(shù)組a的指針變量,則對數(shù)組的引用可以用a[i]、p[i]、*(a+i)、*(p+i)等(i為相應(yīng)數(shù)組元素的下標(biāo))。

【例6.6】

輸出數(shù)組元素的三種方法。

(1)通過數(shù)組名。

由于數(shù)組名就是數(shù)組的首地址,所以可以通過數(shù)組名輸出數(shù)組元素。

程序如下:圖6.11例6.6的運(yùn)行結(jié)果圖6.12例6.7的運(yùn)行結(jié)果 6.4指針與字符串

6.4.1指向字符串的指針變量

C語言對字符串常量是按字符數(shù)組處理的,在內(nèi)存中開辟了一個字符數(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論