第五章指針ppt課件_第1頁
第五章指針ppt課件_第2頁
第五章指針ppt課件_第3頁
第五章指針ppt課件_第4頁
第五章指針ppt課件_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章 指 針Chapter 5 Pointer第五章第五章 指指 針針PointerPointer第五章 指 針Chapter 5 Pointer5.1 指針的概念指針的概念 指針是指針是C言語的重要特征,是言語的重要特征,是C言語訪問內(nèi)存數(shù)據(jù)和程序的靈敏言語訪問內(nèi)存數(shù)據(jù)和程序的靈敏和有效的手段。和有效的手段。 C C言語的指針支持:言語的指針支持: 函數(shù)的地址調(diào)用;函數(shù)的地址調(diào)用; 動態(tài)分配內(nèi)存;動態(tài)分配內(nèi)存; 數(shù)組的地址援用。數(shù)組的地址援用。第五章 指 針Chapter 5 Pointer內(nèi)存、地址、指針內(nèi)存、地址、指針 (Memory ,Address, Pointer) (Memor

2、y ,Address, Pointer) 內(nèi)存存放了計算機(jī)正在運轉(zhuǎn)的程序和程序正在運用的數(shù)據(jù)。內(nèi)內(nèi)存存放了計算機(jī)正在運轉(zhuǎn)的程序和程序正在運用的數(shù)據(jù)。內(nèi)存的根本單元是字節(jié)存的根本單元是字節(jié)(Byte)。 為了訪問內(nèi)存單元,為了訪問內(nèi)存單元,CPU給每個內(nèi)存單元一個編號,該編號稱給每個內(nèi)存單元一個編號,該編號稱為該內(nèi)存單元的地址。為該內(nèi)存單元的地址。 變量是程序中可以改動的量,當(dāng)說變量是程序中可以改動的量,當(dāng)說明變量時,系統(tǒng)將為其在內(nèi)存中開辟相明變量時,系統(tǒng)將為其在內(nèi)存中開辟相應(yīng)得內(nèi)存單元。由此確定變量的地址及應(yīng)得內(nèi)存單元。由此確定變量的地址及內(nèi)存中的表示方式。內(nèi)存中的表示方式。2000H2019

3、H2019H2019Hint a=0;a的的內(nèi)內(nèi)存存單單元元a的地址的地址&a 假設(shè)有一變量假設(shè)有一變量p,其內(nèi)容存放了,其內(nèi)容存放了a的的地址地址&a,經(jīng)過,經(jīng)過p也可實現(xiàn)對也可實現(xiàn)對a的訪問,的訪問,p稱為指針,并指向稱為指針,并指向a。00H20H00p第五章 指 針Chapter 5 Pointer指針的闡明指針的闡明 指針是特殊類型的變量,其內(nèi)容是變量的地址。在運用前必需指針是特殊類型的變量,其內(nèi)容是變量的地址。在運用前必需闡明,闡明某標(biāo)識符是指針類型,并可指向某種類型的對象。闡明,闡明某標(biāo)識符是指針類型,并可指向某種類型的對象。指針的闡明格式:指針的闡明格式: type *pnam

4、e1,*pnamen;標(biāo)識符命名的指針變量名。標(biāo)識符命名的指針變量名。指針標(biāo)志。指針標(biāo)志。指針指向?qū)ο蟮念愋?。指針指向?qū)ο蟮念愋汀nt *p, *q; /* p、q是指向整型變量的指針。是指向整型變量的指針。*/float *pfValue ,*pf; /* pfValue和和pf是指向浮點型的指針。是指向浮點型的指針。*/第五章 指 針Chapter 5 Pointer指針對變量的援用指針對變量的援用 定義指針的目的是經(jīng)過指針援用內(nèi)存對象,指針的援用應(yīng)按如定義指針的目的是經(jīng)過指針援用內(nèi)存對象,指針的援用應(yīng)按如下步驟進(jìn)展:下步驟進(jìn)展:闡明指針闡明指針 int a=0, *p;指針指向?qū)ο笾羔?/p>

5、指向?qū)ο髉=&a;經(jīng)過指針援用對象經(jīng)過指針援用對象*p=*p+2;指針操作的兩種運算:指針操作的兩種運算:取地址運算取地址運算 & &a表示取變量表示取變量a地址的運算。地址的運算。間接運算間接運算 * *p表示取指針表示取指針p指向變量內(nèi)容的運算。指向變量內(nèi)容的運算。int a,*p; 2000Happ=&a; /* p指向指向a。 */2000H*p=2;2第五章 指 針Chapter 5 Pointer舉例:舉例:#include void main (void ) int x ,*p; x=55; p=&x; printf ( “ %d, %u , x, *p) ; *p=65; pr

6、intf ( “ %d, %u, x, *p) ;2000Hxp2000H5565關(guān)于指針的闡明:關(guān)于指針的闡明:指針必需指向?qū)ο蠛?,才干援用。指針必需指向?qū)ο蠛螅鸥稍谩?int *p; *p=2; /* Error! */ &和和 * 為互補(bǔ)運算。為互補(bǔ)運算。int a,*p; p=&a;那么:那么:&*p p *&a a第五章 指 針Chapter 5 Pointer指針的運算指針的運算 指針是特殊類型的變量,其內(nèi)容是變量的地址,因此指針的運指針是特殊類型的變量,其內(nèi)容是變量的地址,因此指針的運算及結(jié)果一定要符合地址邏輯。算及結(jié)果一定要符合地址邏輯。五種算術(shù)運算五種算術(shù)運算int a,

7、 b, *p1, *p2;p1=&a;p2=&b;a2000Hb2400Hp1p22000H2400Hp1+; /*含義指向含義指向a后的整型單元后的整型單元*/2019H2019Hp1- -; /*指向指向a前的整型單元前的整型單元*/p1+n; /*指向指向a后的第后的第n個整型單元個整型單元*/p1- n; /*指向指向a前的第前的第n個整型單元個整型單元*/p2- p1; /*a和和b之間差的單元數(shù)之間差的單元數(shù)*/結(jié)果結(jié)果200Hp n 相當(dāng)于相當(dāng)于: p的實踐內(nèi)容的實踐內(nèi)容 nsizeof(*p);六種關(guān)系運算六種關(guān)系運算比較兩個同類型變量之間的地址關(guān)系。比較兩個同類型變量之間的地

8、址關(guān)系。p1p2;第五章 指 針Chapter 5 Pointer指針賦值運算#include void main(void) int a,b,*p1,*p2; a=2; b=3; p1=&a; p2=&b; *p1=*p2; printf(“%d,%dn,a,b); a=3; b=5; p1=p2; printf(“%d,%d,*p1,*p2);差別差別a&a 2000Hb&b 2400Hp1p2232000H2400H第五章 指 針Chapter 5 Pointer5.2 指針與數(shù)組指針與數(shù)組 數(shù)組是同類型的變量的集合,各元素按下標(biāo)的特定順序占據(jù)一數(shù)組是同類型的變量的集合,各元素按下標(biāo)的特

9、定順序占據(jù)一段延續(xù)的內(nèi)存,各元素的地址也延續(xù),指針對數(shù)組元素非常方便。段延續(xù)的內(nèi)存,各元素的地址也延續(xù),指針對數(shù)組元素非常方便。指針與一維數(shù)組指針與一維數(shù)組經(jīng)過指針援用數(shù)組元素可以分以下三個步驟:經(jīng)過指針援用數(shù)組元素可以分以下三個步驟:闡明指針和數(shù)組闡明指針和數(shù)組int *p,a10;指針指向數(shù)組指針指向數(shù)組p=a; /*指向數(shù)組的首地址指向數(shù)組的首地址*/p=&a0; /*指向數(shù)組的首地址指向數(shù)組的首地址*/經(jīng)過指針援用數(shù)組元素經(jīng)過指針援用數(shù)組元素當(dāng)指針指向數(shù)組的首地址時,那么下標(biāo)為當(dāng)指針指向數(shù)組的首地址時,那么下標(biāo)為i的元素地址為:的元素地址為: p+i 或或a+i援用數(shù)組元素可以有三種方

10、法:援用數(shù)組元素可以有三種方法:下標(biāo)法:下標(biāo)法: a i 指針法:指針法: *(p+i)數(shù)組名法:數(shù)組名法:*(a+i)留意:數(shù)組名是地址常量,不能改動!留意:數(shù)組名是地址常量,不能改動! a=p; /*Error!*/第五章 指 針Chapter 5 Pointer舉例:打印數(shù)組中的奇數(shù)。舉例:打印數(shù)組中的奇數(shù)。#include void main(void ) int i ,a 10 ; for (i=0 ; i10 ; i+ ) scanf ( “ %d , &ai ) ; for (i=0 ; i10 ; i+) if ( a i % 2 ) printf ( “ %d, a i );

11、 數(shù)組元素法。數(shù)組元素法。循環(huán)輸入。循環(huán)輸入。循環(huán)判別,滿足條件輸出。循環(huán)判別,滿足條件輸出。數(shù)組名法。數(shù)組名法。 a+i *(a+i)指針法。指針法。 ,*p ;p = a;p+*(p+i)結(jié)果能否結(jié)果能否正確?正確?p= a; *p=&a0;*留意指針在運算時的變化。留意指針在運算時的變化。第五章 指 針Chapter 5 Pointer指針與字符串字符數(shù)組指針與字符串字符數(shù)組字符串在內(nèi)存中可以存儲為兩種方式:字符串在內(nèi)存中可以存儲為兩種方式:字符數(shù)組字符數(shù)組字符串常量字符串常量 可以使指針指向字符數(shù)組或字符串常量,經(jīng)過指針援用字符數(shù)可以使指針指向字符數(shù)組或字符串常量,經(jīng)過指針援用字符數(shù)組

12、或字符串的各個字符。組或字符串的各個字符。v指針與字符數(shù)組:指針與字符數(shù)組:char *chp,str =Hello!; /*闡明字符指針和字符數(shù)闡明字符指針和字符數(shù)組組*/chp=str; /*指針指向字符數(shù)組指針指向字符數(shù)組*/putchar( *(chp+2); /*經(jīng)過指針援用數(shù)組元素經(jīng)過指針援用數(shù)組元素*/v指針與字符串:指針與字符串:char *strp; /*闡明字符指針闡明字符指針*/strp=“Hello!; /*指針指向字符串指針指向字符串*/puts(strp); /*經(jīng)過指針援用字符串經(jīng)過指針援用字符串*/闡明指針時,可以同時賦初值,如:闡明指針時,可以同時賦初值,如:

13、char *strp=“Hello!;賦值表示將字符串的地址賦給指針!賦值表示將字符串的地址賦給指針!第五章 指 針Chapter 5 Pointer舉例:將字符串中的大寫字母轉(zhuǎn)化對應(yīng)的小寫字母。舉例:將字符串中的大寫字母轉(zhuǎn)化對應(yīng)的小寫字母。#include void main(void) char *p,s80; p=s; gets(p); for(;*p!=0;p+) if(*p=A&*p=Z) *p+=32; p=s; puts(p); 第五章 指 針Chapter 5 Pointer將無符號的八進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)。將無符號的八進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)。#include voi

14、d main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn,n); p指向指向s數(shù)組。數(shù)組。輸入字符串。輸入字符串。sps5560n=0*8+5-05n=5*8+5-045n=45*8+6-0366思索題:將思索題:將4位十六進(jìn)值字符串轉(zhuǎn)化為十進(jìn)制字符串。位十六進(jìn)值字符串轉(zhuǎn)化為十進(jìn)制字符串。第五章 指 針Chapter 5 Pointer二維數(shù)組的地址二維數(shù)組的地址如下闡明數(shù)組如下闡明數(shù)組int a34=1,2,3,4,5,6,7,8,9,10,11,12;其二維構(gòu)造如下:其二

15、維構(gòu)造如下:12345 6789101112行行列列為了便于索引,為了便于索引,C言語將數(shù)組分為兩級管理。言語將數(shù)組分為兩級管理。a0a1a2 將將a了解為一維數(shù)組,了解為一維數(shù)組, 數(shù)組有三個元素,它們分別為數(shù)組有三個元素,它們分別為a0、a1,a2 。各個元素又是一個有四個元素的一維數(shù)組。各個元素又是一個有四個元素的一維數(shù)組。從地址的角度看:從地址的角度看:a 為為a0 第一行的首地址第一行的首地址a+1 為為a1 第二行的首地址第二行的首地址a+2 為為a2 第三行的首地址第三行的首地址a+1 地址一次加一行。地址一次加一行。i行行j列數(shù)組元素的地址可以由列數(shù)組元素的地址可以由a i +

16、j得到。得到。第五章 指 針Chapter 5 Pointer數(shù)組名地址的兩級管理數(shù)組名地址的兩級管理aa0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23等價地址及其管理方式等價地址及其管理方式數(shù)組名是數(shù)組的地址,而且是常量,數(shù)組名是數(shù)組的地址,而且是常量,* 運算不改動其值!運算不改動其值!以下三種地址等價:以下三種地址等價:a+i*(a+i)a i 加法按行遞增加法按行遞增加法按列遞增加法按列遞增(a+1)+1*(a+1)+1差別?差別?第五章 指 針Chapter 5 Pointer 數(shù)組名表示數(shù)組元素數(shù)組名表示數(shù)組元素a i j (*

17、(a+i) j *(*(a+i)+j)*(a i +j)指針與二維數(shù)組指針與二維數(shù)組int *p, a34;p=a;aij*(p+4*i+j)等價!等價!a00aa01a02a0a10a11a12a1a20a21a22a2a+1a1+2第五章 指 針Chapter 5 Pointer舉例:舉例: 在數(shù)組在數(shù)組a中查找輸入的數(shù),輸出行列位置。中查找輸入的數(shù),輸出行列位置。#include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d , &iS) ; for(

18、i=0;i3;i+)for(j=0;j4;j+) if(iS= a i j ) printf(“iS equal to a%d %d n,i , j); 下標(biāo)法。下標(biāo)法。*(a i +j)*(*(a+i)+j)*(p+4*i+j)第五章 指 針Chapter 5 Pointer5.3 指指 針針 數(shù)數(shù) 組組 指針是存放其它數(shù)據(jù)對象地址的變量。因此,指針可以構(gòu)成數(shù)指針是存放其它數(shù)據(jù)對象地址的變量。因此,指針可以構(gòu)成數(shù)組。每個數(shù)組元素為一個指針變量,且在內(nèi)存中延續(xù)存放。組。每個數(shù)組元素為一個指針變量,且在內(nèi)存中延續(xù)存放。指針數(shù)組的闡明指針數(shù)組的闡明闡明格式:闡明格式: type *數(shù)組名數(shù)組名co

19、nst exp;int *p 4 ;含義是在內(nèi)存中開辟空間,并指明元素所指向的對象的類型。含義是在內(nèi)存中開辟空間,并指明元素所指向的對象的類型。p 0 p 1 p 2 p 3 數(shù)組名數(shù)組名p為數(shù)組的地址。為數(shù)組的地址。運用前必需讓各元素指向?qū)ο?。運用前必需讓各元素指向?qū)ο蟆nt i, a34, *p3;for(i=0;i3;i+) p i =a i ;*(p2+1)=2; /*經(jīng)過指針數(shù)組援用數(shù)組元素經(jīng)過指針數(shù)組援用數(shù)組元素a21*/ 第五章 指 針Chapter 5 Pointer指針數(shù)組的運用舉例指針數(shù)組的運用舉例指針數(shù)組與多維數(shù)組指針數(shù)組與多維數(shù)組 經(jīng)過指針數(shù)組按數(shù)學(xué)方式輸出數(shù)組的值。

20、經(jīng)過指針數(shù)組按數(shù)學(xué)方式輸出數(shù)組的值。#include void main ( ) int i , j; int a34= 1,2,3,4, 5,6,7,8, 9,10,11,12 ; int *p3; p0 = a0; p1 = a1 ; p2 = a2; for (i=0 ; i3 ; i+) for (j=0; j4; j+) printf (“ %5d , *(pi+j); printf ( “n ) ; 123456789 101112 p0數(shù)組數(shù)組a的二維構(gòu)造的二維構(gòu)造p1p2a0a1a2每輸出一行,打印回車。每輸出一行,打印回車。第五章 指 針Chapter 5 Pointer指針

21、數(shù)組與多字符串指針數(shù)組與多字符串經(jīng)過指針數(shù)組構(gòu)成的菜單,執(zhí)行經(jīng)過指針數(shù)組構(gòu)成的菜單,執(zhí)行DOS命令。命令。#include void main(void )char *command = “dir, “time, “date, ch ; for ( ; ; ) do printf (“1: directoryn) ; printf (“2:set timen ) ; printf (“3:set daten) ; printf (“4:quitn) ; printf (nselection:) ; ch =getchar( ) ; printf (“n) ; while (ch4) ; if

22、(ch=4) break; system (commandch-1) ; 內(nèi)層循環(huán)輸入選項內(nèi)層循環(huán)輸入選項外層循環(huán)根據(jù)選項執(zhí)行命令外層循環(huán)根據(jù)選項執(zhí)行命令執(zhí)行系統(tǒng)命令函數(shù),如執(zhí)行系統(tǒng)命令函數(shù),如:system(“dir);dir0time0date0command0command1command23-1 2第五章 指 針Chapter 5 Pointer5.4 指向指針的指針指向指針的指針 假設(shè)指針變量的內(nèi)容存放其它指針的地址,稱該指針為指向指假設(shè)指針變量的內(nèi)容存放其它指針的地址,稱該指針為指向指針的指針。針的指針。 指向指針的指針的闡明:指向指針的指針的闡明:方式:方式: type *p;i

23、nt *p;p是一個指向整形指針的指針。是一個指向整形指針的指針。#include void main ( void) int x, *p, *q ; x=10; p=&x; q=&p; printf (“%d , * *q) ; p為指向整型的指針。為指向整型的指針。q為指向整型指針的指針。為指向整型指針的指針。xpq2000H3000H102000H3000H第五章 指 針Chapter 5 Pointer指向指針的指針的運用指向指針的指針的運用指向指針的指針普通用于多維數(shù)組和指針數(shù)組的操作。指向指針的指針普通用于多維數(shù)組和指針數(shù)組的操作。多維數(shù)組多維數(shù)組#include void main ( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12, ; int *arr3 = a0 , a1 , a2 ; int i ,j, *p ; p=arr ; for (i=0 ;i3; i+) for (j=0 ; i4 ; j+) printf(“%5d , *( *(p+i)+ j ) ) ; printf (“n) ;aiaij123456789101112a0a1a2arrarrpp+1第五章 指 針Chapter 5 Pointer用于處置多字符

溫馨提示

  • 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

提交評論