版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第十章第十章 指針指針主要內(nèi)容主要內(nèi)容地址和指針的概念地址和指針的概念變量的指針和指向變量的變量的指針和指向變量的 指針變量指針變量數(shù)組與指針數(shù)組與指針 字符串與指針字符串與指針指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針指向函數(shù)的指針指向函數(shù)的指針返回指針值的函數(shù)返回指針值的函數(shù)本章要求:基本概本章要求:基本概念一定要清晰念一定要清晰地址和指針的概念地址和指針的概念計(jì)算機(jī)內(nèi)的存儲(chǔ)部件,程序運(yùn)行時(shí),相關(guān)指計(jì)算機(jī)內(nèi)的存儲(chǔ)部件,程序運(yùn)行時(shí),相關(guān)指令和數(shù)據(jù)都保存在內(nèi)存內(nèi)令和數(shù)據(jù)都保存在內(nèi)存內(nèi)速度快,但是掉電即失速度快,但是掉電即失可以隨機(jī)訪問可以隨機(jī)訪問只要指名要訪問的內(nèi)存單元的只要指名要訪問的
2、內(nèi)存單元的地址地址,就可以立即,就可以立即訪問到該單元訪問到該單元地址地址是一個(gè)無符號(hào)整數(shù)是一個(gè)無符號(hào)整數(shù)內(nèi)存中的每個(gè)字節(jié)都有唯一的一個(gè)地址內(nèi)存中的每個(gè)字節(jié)都有唯一的一個(gè)地址地址按字節(jié)編號(hào),按類型分配空間地址按字節(jié)編號(hào),按類型分配空間內(nèi)存地址內(nèi)存地址訪問變量的方式訪問變量的方式如何讀寫內(nèi)存中的數(shù)如何讀寫內(nèi)存中的數(shù)據(jù)?據(jù)?通過變量的地址訪問變通過變量的地址訪問變量所在的存儲(chǔ)單元量所在的存儲(chǔ)單元C語言訪問變量的方式語言訪問變量的方式直接訪問直接訪問 直接按變量地址來存直接按變量地址來存取變量內(nèi)容的訪問方取變量內(nèi)容的訪問方式式間接訪問間接訪問 通過指針變量來間接通過指針變量來間接存取它所指向的變量存
3、取它所指向的變量的訪問方式的訪問方式 0 內(nèi)存用戶數(shù)據(jù)區(qū) 2000 3 變量i 2002 6 變量j 2004 9 變量k 3010 2000 變量i_pointer 例:用變量 i_pointer 來存放變量 i 的地址。如果要得到 i 的值,先訪問變量 i_pointer ,得到 i_pointer 的值為2000(該值是變量 i 的地址),再通過地址 2000 找到所指存儲(chǔ)單元中的值(i 的值),見圖。 3變量變量i_pointeri200020003010一個(gè)變量的地址稱為該變量的“指針指針”。例如,地址2000是變量的指針。如果有一個(gè)變量專門用來存放另一變量的地址(即指針),則它稱為
4、“指針變量指針變量”。上述的i_pointer就是一個(gè)指針變量。指針和指針變量的定義:指針和指針變量的定義:變量的變量的指針和指針和指向變量的指向變量的指針變量指針變量指針的概念指針的概念指針也是一種數(shù)據(jù)類型指針也是一種數(shù)據(jù)類型指針變量指針變量 具有指針類型的變量,專門存放地址數(shù)據(jù)的變量具有指針類型的變量,專門存放地址數(shù)據(jù)的變量 變量的指針變量的指針 變量的地址變量的地址指針變量的定義指針變量的定義 一般形式為一般形式為 基類型基類型 *指針變量名;指針變量名; 例:例:int *p; 定義了一個(gè)指針定義了一個(gè)指針變量變量p,簡稱指針,簡稱指針p p是變量,是變量,int*是類型是類型 p可用
5、于存放地址。尚未初始化,隨機(jī)值。危險(xiǎn)!指向一個(gè)可用于存放地址。尚未初始化,隨機(jī)值。危險(xiǎn)!指向一個(gè)不確定的地址。不確定的地址。 指針變量初始化指針變量初始化 int a,*p=&a; *p就像普通的變量一樣使用,其值是就像普通的變量一樣使用,其值是p指向的內(nèi)存的內(nèi)容指向的內(nèi)存的內(nèi)容(在此例中和(在此例中和a等價(jià),但尋址方式不同)等價(jià),但尋址方式不同) p可以動(dòng)態(tài)(任意)地指向不同內(nèi)存,從而使可以動(dòng)態(tài)(任意)地指向不同內(nèi)存,從而使*p代表不同的代表不同的變量變量int i,*p;p=&i; int *p;float *q;p=q;int i;float *p;p=&i;in
6、t *p;p=100;指針變量只指針變量只存放地址存放地址!一個(gè)指針變量不能一個(gè)指針變量不能指向與其類型不同指向與其類型不同的變量的變量!我是真的,我是真的,你猜對(duì)了嗎?你猜對(duì)了嗎?應(yīng)在類型相應(yīng)在類型相同的指針變同的指針變量之間賦值量之間賦值指針變量的引用指針變量的引用 例例. 通過指針變量訪問其所指的變量通過指針變量訪問其所指的變量#include void main()int a,b;int *pointer_1, *pointer_2;a=100;b=10;pointer_1=&a; pointer_2=&b; printf(%d,%dn,a,b);printf(%d,%
7、dn,*pointer_1,*pointer_2);對(duì)對(duì)“”和和“*”運(yùn)算符說明運(yùn)算符說明 優(yōu)先級(jí)、結(jié)合性:優(yōu)先級(jí)、結(jié)合性: 已知:已知:int a,b;int *pointer_1, *pointer_2;pointer_1=&a;pointer_2=&b;則:則: * pointer_等價(jià)于等價(jià)于 pointer_2 * pointer_ ; pointer_2原來指向,經(jīng)過重新賦值后它已不再指向了,原來指向,經(jīng)過重新賦值后它已不再指向了,而指向了。而指向了。 *等價(jià)于等價(jià)于 (*pointer_)+等價(jià)于等價(jià)于例例2.輸入和兩個(gè)整數(shù),按先大后小的輸入和兩個(gè)整數(shù),按先大后小
8、的順序輸出和。順序輸出和。#include void main()int *p1,*p2,*p,a,b;scanf(%d,%d,&a,&b); printf(a=%d,b=%dnn,a,b);p1=&a;p2=&b; if(a q p q p = q指針不與非指針量進(jìn)行比較,但可與指針不與非指針量進(jìn)行比較,但可與NULL(即即0值值)進(jìn)進(jìn)行等或不等的關(guān)系運(yùn)算行等或不等的關(guān)系運(yùn)算 判斷判斷p是否為空指針是否為空指針 P = NULL p != NULL指針運(yùn)算指針運(yùn)算賦值運(yùn)算賦值運(yùn)算指針在使用前一定要賦值指針在使用前一定要賦值為指針變量賦的值必須是一個(gè)地址為指針變
9、量賦的值必須是一個(gè)地址void main() int *p; scanf(%d,p); 錯(cuò)!數(shù)組與指針數(shù)組與指針 難點(diǎn):二維數(shù)組的地址和指針的概念難點(diǎn):二維數(shù)組的地址和指針的概念指向數(shù)組元素的指針指向數(shù)組元素的指針一個(gè)變量有地址,那么一個(gè)數(shù)組包含若干元素,一個(gè)變量有地址,那么一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個(gè)指針變數(shù)組元素(把某一元素的地址放到一個(gè)指針變量中)。所謂量中)。所謂數(shù)組元
10、素的指針就是數(shù)組元素的數(shù)組元素的指針就是數(shù)組元素的地址地址。2022-3-313560006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+幾點(diǎn)說明:幾點(diǎn)說明: 為下標(biāo)運(yùn)算符,對(duì)于一維數(shù)組,為下標(biāo)運(yùn)算符,對(duì)于一維數(shù)組,ai按按a+i計(jì)計(jì)算地址,然后找出該地址單元的值算地址,然后找出該地址單元的值int *p, a10;p = a;其中其中a為指針常量,為指針常量,p為指針變量;為指針變量;p值可以修改,值可以修改,a不可修改。不可修改。2022-3-3137 區(qū)分:區(qū)
11、分:*p+ (*p)+ *(p+)*(+p) int *p, a10;p = a; *p+ 等價(jià)于等價(jià)于 *(p+)即先即先*p,再,再p+使用使用a0的值,然后的值,然后p指向指向a1 (*p)+ 即即(a0)+ *(p+)見見1 *(+P)即先即先p+,再,再*p1.p指向指向a1,然后使用,然后使用a1的值的值一維數(shù)組作函數(shù)參數(shù)一維數(shù)組作函數(shù)參數(shù)(例:(例:10.7-10.9)主調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)int *p, a10;p = a;f(a,10) void f(int array,int n)f(p,10)void f(int *array,int n)2022-3-3140
12、a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2 a23;2022-3-3141一維數(shù)組a a1 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23行地址列地址列地址列地址a0+0 a0+1 a0+2 a0+3a2+0 a2+1 a2+2 a2+3a1+0 a1+1 a1+2 a1+3一維數(shù)組a2一維數(shù)組a1一維數(shù)組a0a0 a2 a+0 &a0
13、a+1 &a1 a+2&a2 2022-3-31422022-3-31432022-3-3144a00a01a02a10a11a12pp+2022-3-3145a00a01a02a10a11a12pp+二維數(shù)組作函數(shù)參數(shù)二維數(shù)組作函數(shù)參數(shù)(例:(例:10.13-10.14)用指向數(shù)組元素的指針變量(列指針)用指向數(shù)組元素的指針變量(列指針)主調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)int a34,*p;p = a0;f(a0,12)void f(int *p,int n)f(*a,12)f(p,12)二維數(shù)組作函數(shù)參數(shù)二維數(shù)組作函數(shù)參數(shù)(例:(例:10.13-10.14)用指向一維數(shù)組的
14、指針變量(行指針)用指向一維數(shù)組的指針變量(行指針)主調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)int a34,(*p)4;p = a;f(a,3) void f(int array4,int n)f(p,3) void f(int (*p)4,int n)字符串與指針字符串與指針復(fù)習(xí):復(fù)習(xí):字符串字符串(String)與字符數(shù)組與字符數(shù)組字符串字符串一串以一串以0結(jié)尾的字符在結(jié)尾的字符在C語言中被看作字符串語言中被看作字符串用雙引號(hào)括起的一串字符是字符串常量,用雙引號(hào)括起的一串字符是字符串常量,C語言自動(dòng)語言自動(dòng)為其添加為其添加0終結(jié)符終結(jié)符C語言并沒有為字符串提供任何專門的表示法,完全語言并沒有為字符
15、串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理使用字符數(shù)組和字符指針來處理字符數(shù)組字符數(shù)組每個(gè)元素都是字符類型的數(shù)組每個(gè)元素都是字符類型的數(shù)組例如:例如: 一維:一維: char string80; 二維:二維: char string380;字符數(shù)組的初始化字符數(shù)組的初始化用字符型數(shù)據(jù)對(duì)數(shù)組進(jìn)行初始化用字符型數(shù)據(jù)對(duì)數(shù)組進(jìn)行初始化 char str6 = C,h,i,n,a,0; 字符數(shù)組并不要求最后一個(gè)字符為字符數(shù)組并不要求最后一個(gè)字符為0用字符串常量直接對(duì)數(shù)組初始化用字符串常量直接對(duì)數(shù)組初始化 char str6 = China; char str6 = China;逐個(gè)輸入輸出
16、逐個(gè)輸入輸出(getchar(),putchar(ch)/%c)for (i=0; si!=n; i+) si=getchar();for (i=0; si!=0; i+) putchar(si);putchar(n);scanf(%s,s); printf(%s,s);char s10;gets(s); puts(s);注:注:gets()puts()函數(shù)具體函數(shù)具體用法參見字符串處理函數(shù)用法參見字符串處理函數(shù)一次性輸入輸出一次性輸入輸出字符數(shù)組的輸入與輸出字符數(shù)組的輸入與輸出字符指針字符指針字符串與字符數(shù)組、字符指針字符串與字符數(shù)組、字符指針 字符串字符串 字符數(shù)組字符數(shù)組 字符指針字符指
17、針 指向字符類型的指針指向字符類型的指針 char* p; 數(shù)組和指針可以等同看待,上面三者本質(zhì)上是一回事數(shù)組和指針可以等同看待,上面三者本質(zhì)上是一回事字符指針變量與字符數(shù)組的區(qū)別字符指針變量與字符數(shù)組的區(qū)別 定義方法不同定義方法不同 char str10; 賦值方法和含義不同賦值方法和含義不同char str10; ptr = ”china”; /*錯(cuò)誤錯(cuò)誤*/ strcpy(str,”china”); /*正確正確*/ char *ptr;char *ptr; ptr = ”china”;字符指針變量與字符數(shù)組的區(qū)別字符指針變量與字符數(shù)組的區(qū)別 在定義一個(gè)數(shù)組時(shí),在編譯時(shí)即分配單元,有確定
18、地址,在定義一個(gè)數(shù)組時(shí),在編譯時(shí)即分配單元,有確定地址,而定義一個(gè)字符指針變量時(shí),如未對(duì)它賦初值,則其而定義一個(gè)字符指針變量時(shí),如未對(duì)它賦初值,則其所所指數(shù)據(jù)指數(shù)據(jù)是不定的,因而使用是是不定的,因而使用是危險(xiǎn)危險(xiǎn)的。的。 例如,輸入字符串時(shí)例如,輸入字符串時(shí) char str10; scanf(%s, str); /*正確正確*/ char *a; scanf(%s, a); /*錯(cuò)誤錯(cuò)誤*/ 應(yīng)為:應(yīng)為: char *a,str10; a = str; scanf(%s, a); /*正確正確*/字符指針變量與字符數(shù)組的區(qū)別字符指針變量與字符數(shù)組的區(qū)別 初始化含義不同初始化含義不同char
19、str14 = ”china”;不等價(jià)于不等價(jià)于 char str14; str = ”china”;char *pstr = ”china”; 等價(jià)于等價(jià)于 char *pstr; pstr = ”china”;字符指針是變量,而數(shù)組名是地址常量字符指針是變量,而數(shù)組名是地址常量2022-3-31582022-3-3159下標(biāo): 0 1 2 3 4 5 6 7 8 9 10 11 HelloChina0HelloChina0fromitoi下標(biāo)移動(dòng)方向toi=0fromto結(jié)束拷貝ii+i HelloChina0HelloChina0*from* to指針移動(dòng)方向指針移動(dòng)方向*to=0tof
20、rom+fromfromto+to2022-3-3160指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針2022-3-31622022-3-31632022-3-3164 name0 P a s c a l 0 0 0 0 name1 B a s i c 0 0 0 0 0 name2 F o r t r a n 0 0 0 name3 J a v a 0 0 0 0 0 0 name4 V i s u a l C 0 0 name0 B a s i c 0 0 0 0 0 name1 F o r t r a n 0 0 0 name2 J a v a 0 0 0 0 0 0 name3 P
21、a s c a l 0 0 0 0 name4 V i s u a l C 0 0 2022-3-31652022-3-3166指針數(shù)組ptr 字符串排序前Pascal0Basic0Fortran0Java0Visual C0ptr0ptr1ptr2ptr3ptr4指針數(shù)組ptr 字符串排序后Pascal0Basic0Fortran0Java0Visual C0ptr0ptr1ptr2ptr3ptr42022-3-31672022-3-3168 變量 ipp 變量 ip 變量 i &ip &i *ipp *ipp 5 &ip &i 2022-3-3169PascalBasicFortranJavaptr指針數(shù)組指針數(shù)組字符串字符串pVisual C2022-3-31702022-3-3171echo.exeprogrammingisfunptr指針數(shù)組指針數(shù)組字符串字符串name返回指針值的函數(shù)返回指針值的函數(shù)定義:定義:數(shù)據(jù)類型數(shù)據(jù)類型 *函數(shù)名函數(shù)名(參數(shù)表參數(shù)表) 例:有若干個(gè)學(xué)生的成績(每個(gè)學(xué)生有門課例:有若干個(gè)學(xué)生的成績(每個(gè)學(xué)生有門課程),要求在用戶輸入學(xué)生序號(hào)以后,能輸出程),要求在用戶輸入學(xué)生序號(hào)以后,能輸出該學(xué)生的全部成績。該學(xué)生的全部成績。#include float *
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 苯換熱器課程設(shè)計(jì)前言
- 物流傳媒業(yè)營銷活動(dòng)總結(jié)
- 酒店領(lǐng)班的領(lǐng)導(dǎo)力培養(yǎng)
- 化工工業(yè)行業(yè)營銷策略總結(jié)
- 餐具店銷售員工工作總結(jié)
- 2024年稅務(wù)師題庫2
- 2025屆阜陽市高三語文上學(xué)期期末統(tǒng)測(cè)考試卷及答案解析
- 制定合同范本(2篇)
- 創(chuàng)新研發(fā)保密協(xié)議書(2篇)
- 2024年理論培訓(xùn)心得體會(huì)
- 2024年度玩具代工生產(chǎn)及銷售合同模板(2024版)3篇
- 2024年小學(xué)五年級(jí)科學(xué)教學(xué)工作總結(jié)(2篇)
- GB/T 31900-2024機(jī)織兒童服裝
- 2023年首都機(jī)場(chǎng)集團(tuán)有限公司招聘考試真題
- 【7歷期末】安徽省蚌埠市2023-2024學(xué)年部編版七年級(jí)歷史上學(xué)期期末統(tǒng)考試卷(含解析)
- 2024-2025學(xué)年冀教版數(shù)學(xué)五年級(jí)上冊(cè)期末測(cè)試卷(含答案)
- 2025年上半年浙江金華市永康市選調(diào)市紀(jì)檢監(jiān)察信息中心工作人員2人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 美國制造業(yè)經(jīng)濟(jì)2024年度報(bào)告-2024-12-宏觀大勢(shì)
- 小區(qū)充電樁安全協(xié)議書范本(2篇)
- 2024年安徽省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 第二講 七十五載迎盛世 砥礪前行續(xù)華章2024年形勢(shì)與政策(課件)
評(píng)論
0/150
提交評(píng)論