62指針數(shù)組和指向的_第1頁
62指針數(shù)組和指向的_第2頁
62指針數(shù)組和指向的_第3頁
62指針數(shù)組和指向的_第4頁
62指針數(shù)組和指向的_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、62指針數(shù)組和指向指針的指針一、指針數(shù)組的概念一個數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,指針數(shù)組中的每一個元素都相當(dāng)于一個指針變量。一維指針數(shù)組的定義形式為:類型名 *數(shù)組名數(shù)組長度;例如:*p4;由于比 *優(yōu)先級高,因此 p 先4結(jié)合,形成 p4形式,這顯然是數(shù)組形式,他有 4 個元素。然后再與 p 前面的“*”結(jié)合,“*”表示此數(shù)組是指針類型的,每個數(shù)組元素(相當(dāng)于一個指針變量)都可指向一個整型變量。注意不要寫成:(*p)4;這是指向一維數(shù)組的指針變量。之所以用到指針數(shù)組,是因為它比較適合于用來指向若干個字符串,使字符串處理更加方便靈活。例如館有若干本書,想把書名放到一個

2、數(shù)組中(圖 1(a),然后要對這些書目進(jìn)行排序和檢查。按一般方法,字符串本身就是一個字符數(shù)組。因此要設(shè)計一個二維的字符數(shù)組才能存放多個字符串。但在定義二維數(shù)組時,需要指定列數(shù),也就是說二維數(shù)組中每一行中包含的元素個數(shù)(即列數(shù))相等。而實際上各字符串(書名)長度一般是不相等的。如按最長的字符串來定義列數(shù),則會浪費許多內(nèi)存單元,見圖 1(b)。可以分別定義一些字符串,然后用指針數(shù)組中的元素分別指向各字符串,見圖 1(c)。如果想對字符串排序,不必改動字符串的位置,只需改動指針數(shù)組中各元素的指向(即改變各元素的值,這些值是各字符串的首地址)。這樣各字符串的長度可以不同,而且移動指針變量的值(地址)要

3、比移動字符串所花的時間少。例 將若干個字符串按字母順序(由大到?。┹敵?。#include#includevoidmain()voidsort(char*name,n);voidpr(char*name,n);char*name=“Followme”,”BASIC”,”GreatWall”,”FORTARN”,”Computerdesign”;n=5;sort(name,n);pr(name,n);voidsort(char*name,n)char*temp;i,j,k;for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)temp=namei;namei=n

4、amek;namek=temp;voidpr(char*name,n)i;for(i=0;in;i+)prf(“%sn”,namei);運行結(jié)果為:BASICComputerdesignFORTARNFollowmeGreatWall在 main 函數(shù)中定義指針數(shù)組 name,它有 5 個元素,其初值分別為“Followme”,”BASIC”,”GreatWall”,”FORTARN”和”Computerdesign”第一個字符的地址,見圖 1(c)。這些字符串是不等長的(并不是按同一長度定義的)。sort 函數(shù)的作用是對字符串排序。sort 函數(shù)的形參 name 也是指針數(shù)組名,接受實參傳過

5、來的 name 數(shù)組 0 行的地址,因此形參 name數(shù)組和實參 name 數(shù)組指的是同一數(shù)組。用選擇對字符串排序。strcmp是字符串比較函數(shù),namek和 namej是第 k 個和第 j 個字符串的起始地址。strcmp(namek,namej)的值為:如果 namek所指的字符串大于 namej所指的字符串,則此函數(shù)值為正值;若相等,則函數(shù)值為 0;若小于,則函數(shù)值為負(fù)值。if 語句的作用是將兩個串中“小”的那個串的序號(k 或 j 之一)保留在變量 k 中。當(dāng)執(zhí)行完內(nèi)循環(huán) for語句后,從第 i 串到第 n 串這些字符串中,第 k 串最“小”。若 ki就表示最小的串不是第 i 串。故將

6、 namei和 namek對換,也就是將指向第 i 串的數(shù)組元素(是指針型元素)的值與指向第 k 串的數(shù)組元素的值對換。執(zhí)行完 sort 函數(shù)后指針數(shù)組的情況如圖 2 所示。pr函數(shù)的作用是輸出各字符串。name0到 name4分別是各字符串(按從小到大順序排好序的各字符串)的首地址(按字符串從小到大順序,name0指向最小的串),用“%s”格式符輸出,就得到這些字符串。pr函數(shù)也可以改寫成以下形式:voidpr(char*name,n)i;char*p;p=name0;while(i*namej)k=j;這樣只比較 namek和 namej所指向的字符串中的第一個字符。字符串比較應(yīng)當(dāng)用 st

7、rcmp 函數(shù)。二、指向指針的指針從圖 3 可以看到,name 是一個指針數(shù)組,它的每一個元素是一個指針型數(shù)據(jù),其值為地址。name 是一個數(shù)組,它的每一個元素都有相應(yīng)的地址,數(shù)組名 name 代表該指針數(shù)組首元素的地址。name+i是 namei的地址。name+i 就是指向指針型數(shù)據(jù)的指針。還可以設(shè)置一個指針變量 p,它指向指針數(shù)組的元素(見圖 4)。p 就是指向指針型數(shù)據(jù)的指針變量。那么,怎么定義一個指向指針數(shù)據(jù)的指針變量?例如:char*p;p 的前面有兩個*號。從附錄可以知道,*運算符的結(jié)合性是從右到左,因此*p 相當(dāng)于*(*p),顯示*p 是指針變量的定義形式。如果沒有最前面的*,

8、那就定義了一個指向字符數(shù)據(jù)的指針變量?,F(xiàn)在它前面又有一個*號,表示指針變量 p 是指向一個字符指針變量(即指向字符型數(shù)據(jù)的指針變量)的。*p 就是 p 所指向的另一個變量指針,如果有:p=name+2;prf(“%on”,*p);prf(“%sn”,*p);第一個 prf 函數(shù)語句輸出 name2的值(它是一個地址),第二個 prf 函數(shù)語句以字符串形式(%s)輸出字符串“GreatWall”。例 使用指向指針變量的指針。#includevoidmian()char*name=“Followme”,”BASIC”,”GreatWall”,”FORTARN”,”Computerdesign”;c

9、har*p;i;for(i=0;i5;i+)p=name+i;prf(“%sn”,*p);運行結(jié)果如下:BASICComputerdesignFORTARNFollowmeGreatWallp 是指向指針的變量,在第一次執(zhí)行循環(huán)體時,賦值語句“p=name+i;”使 p 指向 name 數(shù)組的 0 號元素 name0,*p 是 name0的值,即第一個字符串的起始地址,用 prf 函數(shù)輸出第一個字符串(格式符為%s)。執(zhí)行 5 次循環(huán)體,依次輸出 5 個字符串。指針數(shù)組的元素也可以不指向字符串,而指向整形數(shù)據(jù)或?qū)嵭蛿?shù)據(jù)等,例如:a5=1,3,5,7,9;*num5,i;*p;for(i=0;i

10、5;i+)numi=&ai;此時為了得到 a2中的數(shù)據(jù) 5,可以先使 p=num+2,然后輸出*p。注意*p 是 p 間接指向的對象的地址 num2。而*p 是 p 間接指向的對象的值,即*num2,也就是 a2的值 5,見圖 4。例 指針數(shù)組的元素指向整型數(shù)據(jù)。這是一個簡單的例子,目的是為了說明它的用法。#includevoidmain()a5=1,3,5,7,9;*num5=&a0, &a1, &a2, &a3, &a4;*p,i;p=num;for(i=0;i1)+argv;prf(“%sn”,*argv);-argc;在 DOS 命令狀態(tài)下輸入令行為file1ChinaBeijing則

11、執(zhí)行以上命令行將會輸出以下信息:ChinaBeijing上面的 main 函數(shù)可以改寫為:voidmian(argc,char*argv)while(argc-1)prf(“%sn”,*+argv);其中*+argv 是先進(jìn)行+argv 的運算,使 argv 指向下一個元素,然后進(jìn)行*的運算,找到 argv 當(dāng)前指向的字符串,輸出該字符串。在開始時,argv 指向字符串“file1”,+argv 使之指向“China”,所以第一次輸出的是“China”,第二次輸出的是“Beijing”。許多操作系統(tǒng)提供了 echo 命令,它的作用是實現(xiàn)“參數(shù)回送”,即將 echo 后面的各參數(shù)(各字符串)在同

12、一行上輸出。實現(xiàn)“參數(shù)回送”的 C 程序(文件名為 echo.c)如下:#includevoidmian(argc,char*argv)while(argc-1)prf(“%s%c”,*+argv,(argc1)? :n);如果命令行輸入:cechoComputerandCLanguage會在顯示屏上輸出:ComputerandCLanguage這個程序與前面的差別在于:1樣的。將 while 語句中的(argc-1)改為(-argc0)的作用是一2當(dāng) argv1 時,在輸出的兩個字符串間輸出一個空格,當(dāng)argc=1 時輸出一個換行。程序不輸出命令名“echo”。為便于理解,echo 程序也可寫成以下形式:#includevoidmian(argc,

溫馨提示

  • 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

提交評論