C語言指針精品_第1頁
C語言指針精品_第2頁
C語言指針精品_第3頁
C語言指針精品_第4頁
C語言指針精品_第5頁
已閱讀5頁,還剩102頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第11章章 指針指針.C程序設計快速進階大學教程2021-12-182第第11章章 指針指針本章要點本章要點 指針概念指針概念 指針與數組指針與數組 指針與函數指針與函數 字符串字符串 動態空間管理動態空間管理.C程序設計快速進階大學教程2021-12-18311 指針指針知識點知識點 指針概念指針概念 指向數組的指針、指針數組指向數組的指針、指針數組 指針做參數、指針做為函數值、指向函數的指針指針做參數、指針做為函數值、指向函數的指針 字符串字符串 動態空間管理動態空間管理.C程序設計快速進階大學教程2021-12-18411.1 理解指針理解指針當問路時,經常聽到這樣的回答:當問路時,經

2、常聽到這樣的回答:“向前走過向前走過3個路個路口右轉,再過兩個路口左轉,再前行口右轉,再過兩個路口左轉,再前行200米。米。”當在圖書館中找一本時,經常是這樣找:當在圖書館中找一本時,經常是這樣找:“第五排第五排書架,從上向下數第二層,左數第書架,從上向下數第二層,左數第6本。本。” 老師提問學生,在不知道學生姓名的情況下,經常老師提問學生,在不知道學生姓名的情況下,經常說:說:“第第4排左數第二個同學。排左數第二個同學。” 上述例子說明對一個事務的訪問,當不能夠通過名上述例子說明對一個事務的訪問,當不能夠通過名稱直接訪問,只能夠通過其位置進行訪問。稱直接訪問,只能夠通過其位置進行訪問。 C程

3、序同樣的道理,前面的章節對數據的訪問是通程序同樣的道理,前面的章節對數據的訪問是通過變量名稱實現的,但是,有時候不知道其名稱,過變量名稱實現的,但是,有時候不知道其名稱,甚至其沒有名稱,這時候只能通過該數據所在的地甚至其沒有名稱,這時候只能通過該數據所在的地址進行訪問。址進行訪問。.C程序設計快速進階大學教程2021-12-18511.2 指向變量的指針指向變量的指針C語言中定義一個變量時,例如:語言中定義一個變量時,例如: int i1=3;描述了變量相關的描述了變量相關的3方面的屬性:方面的屬性:值、地值、地址、類型址、類型。1. 值為值為3,通過變量訪問,如,通過變量訪問,如i1+52.

4、 地址為地址為0012ff78(32位機器,位機器,0012ff78為為16進制數),進制數),占用內存空間的位置,通過占用內存空間的位置,通過&i1訪問,訪問,&在在scanf語句中語句中使用過。使用過。3. 類型為類型為int,決定了其能夠參加的運算,同時也決定了其,決定了其能夠參加的運算,同時也決定了其占用空間的大小(從起始地址開始占用的連續字節數),占用空間的大小(從起始地址開始占用的連續字節數),占用空間的大小通過占用空間的大小通過sizeof運算符,在運算符,在vc中中sizeof(i1)為為4個字節。個字節。.C程序設計快速進階大學教程2021-12-18611.

5、2 指向變量的指針指向變量的指針把變量把變量i1的地址存放于指針變量的地址存放于指針變量pi1中中 .C程序設計快速進階大學教程2021-12-18711.2.1 指針變量的定義指針變量的定義指針變量定義的一般形式為:指針變量定義的一般形式為: 類型說明符類型說明符 *變量名變量名;例如:例如:int *pi1;對指針變量的定義包括三個內容:對指針變量的定義包括三個內容:1. 指針類型說明,指針類型說明,*表示這是一個指針變量;表示這是一個指針變量;2. 指針變量名,指針變量名,pi1為指針變量名;為指針變量名;3. 指針所指向的變量的數據類型,指針所指向的變量的數據類型,int為指針變量所指

6、向的為指針變量所指向的變量的數據類型,說明變量的數據類型,說明pi1只能儲存整型變量的地址。只能儲存整型變量的地址。再如:再如:float *pf1; /*pf1是指向浮點變量的指針變量是指向浮點變量的指針變量*/char *pc1 /*pc1是指向字符變量的指針變量是指向字符變量的指針變量*/.C程序設計快速進階大學教程2021-12-18811.2.2 指針變量的引用指針變量的引用 指針變量同普通變量一樣,使用之前不僅要定指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值。義說明,而且必須賦予具體的值。 未經賦值的指針變量不能使用,否則將造成系未經賦值的指針變量不能使用,

7、否則將造成系統混亂,甚至死機。(統混亂,甚至死機。(問路時別人告訴你一個不存問路時別人告訴你一個不存在的地址,會怎么樣?在的地址,會怎么樣?).C程序設計快速進階大學教程2021-12-18911.2.2 指針變量的引用指針變量的引用 和指針相關有兩個運算符和指針相關有兩個運算符&和和*:1. &:取地址運算符。:取地址運算符。其一般形式為:其一般形式為: &變量名變量名 取一個內存變量的地址。取一個內存變量的地址。2. *:指針運算符(或稱:指針運算符(或稱“間接訪問間接訪問” 運算符)。運算符)。其一般形式為:其一般形式為: *指針變量名指針變量名通過指針變量間接訪

8、問指針變量所指向變量的數據。通過指針變量間接訪問指針變量所指向變量的數據。int i1; int * pi1; pi1=&i1;int i2=*pi1+1; 此處此處*代表間接訪問運算符,取指針變量代表間接訪問運算符,取指針變量pi1所指向的變量所指向的變量i1的值(對的值(對i1間接訪問)加間接訪問)加1賦值給變量賦值給變量i2。此語句結果完。此語句結果完全等價于:全等價于: int i2=i1+1;.C程序設計快速進階大學教程2021-12-181011.2.2 指針變量的引用指針變量的引用指針變量說明:指針變量說明:1. 對對*要區別類型說明符與間接訪訪問符。要區別類型說明符與間

9、接訪訪問符。2. 不能用一個數給指針變量賦值,下面賦值是錯誤的:不能用一個數給指針變量賦值,下面賦值是錯誤的:int *pi1; pi1=20;但是,指針可用但是,指針可用0賦值,代表空指針,哪里也不指向。賦值,代表空指針,哪里也不指向。3. 給指針變量賦值時,指針變量前不能加給指針變量賦值時,指針變量前不能加“*”說明符,下面說明符,下面的寫法是錯誤的:的寫法是錯誤的: int i1; int *pi1; *pi1=&i1;指針變量指針變量pi1前面加前面加*就代表間接訪問了,代表就代表間接訪問了,代表i1。.C程序設計快速進階大學教程2021-12-181111.2.2 指針變量的

10、引用指針變量的引用指針變量說明:指針變量說明:4. 指針變量未指向具體有效地址,間接訪問會有問題指針變量未指向具體有效地址,間接訪問會有問題 int *pi1; /* 指針變量指針變量pi1未賦值,不知道指向哪里未賦值,不知道指向哪里*/ *pi1=200; /* 向向pi1所指向的地址空間賦值所指向的地址空間賦值200 */(隨機給你一個賬戶,存錢后怎樣取呢?隨機給你一個賬戶,存錢后怎樣取呢?)判定一個指針變量是否指向有效空間:判定一個指針變量是否指向有效空間:int *pi1=0;if(pi1!=0) *pi1=200;省略號部分,若未使省略號部分,若未使pi1指向有效空間,這對指向有效空

11、間,這對*pil的賦值就不會的賦值就不會執行。執行。.C程序設計快速進階大學教程2021-12-181211.2.2 指針變量的引用指針變量的引用指針變量說明:指針變量說明:5. 指針變量的值是可以改變的指針變量的值是可以改變的int i1=3,i2=4,*pi1;pi1=&i1;i2=i2+*pi1;.C程序設計快速進階大學教程2021-12-181311.2.2 指針變量的引用指針變量的引用指針變量說明:指針變量說明:5. 指針變量的值是可以改變的指針變量的值是可以改變的pi1=&i2;改變指針變量改變指針變量pi1指向指向i2 .C程序設計快速進階大學教程2021-12-

12、181411.2.2 指針變量的引用指針變量的引用指針變量說明:指針變量說明:6.指針變量只能用同類型的地址賦值指針變量只能用同類型的地址賦值float *pf1; /*pf1是指向浮點變量的指針變量是指向浮點變量的指針變量*/char c1; /*字符變量字符變量*/pf1=&c1;pf1只能存儲只能存儲float數據的地址,用字符型數據地址賦值是錯誤數據的地址,用字符型數據地址賦值是錯誤的。的。.C程序設計快速進階大學教程2021-12-181511.2.2 指針變量的引用指針變量的引用指針變量說明:指針變量說明:7. 同類型指針變量間可以相互賦值同類型指針變量間可以相互賦值例例1

13、1.1 交換指針變量交換指針變量#include int main() int i1=3,i2=4; int *pi1,*pi2,*pi3; pi1=&i1; pi2=&i2;pi3=0; /*交換指針變量交換指針變量*/ pi3=pi1; pi1=pi2; pi2=pi3; printf(i1=%dni2=%dn,i1,i2); printf(*pi1=%dn*pi2=%dn,*pi1,*pi2); return 0; 程序運行結果:程序運行結果:i1=3i2=4*pi1=4*pi2=3.C程序設計快速進階大學教程2021-12-181611.2.2 指針變量的引用指針變量的

14、引用指針變量說明:指針變量說明:7. 同類型指針變量間可以相互賦值同類型指針變量間可以相互賦值例例11.1 交換指針變量交換指針變量.C程序設計快速進階大學教程2021-12-181711.2.2 指針變量的引用指針變量的引用指針變量說明:指針變量說明:7. 同類型指針變量間可以相互賦值同類型指針變量間可以相互賦值例例11.2 交換指針變量所指向的數據交換指針變量所指向的數據#include int main() int i1=3,i2=4; int *pi1,*pi2; int iTemp=0; pi1=&i1; pi2=&i2; /*交換指針變量所指向的數據交換指針變量所指

15、向的數據*/ iTemp=*pi1; *pi1=*pi2; *pi2=iTemp; printf(i1=%dni2=%dn,i1,i2); printf(*pi1=%dn*pi2=%dn,*pi1,*pi2); return 0;程序運行結果:程序運行結果:i1=4i2=3*pi1=4*pi2=3.C程序設計快速進階大學教程2021-12-181811.2.2 指針變量的引用指針變量的引用指針變量說明:指針變量說明:7. 同類型指針變量間可以相互賦值同類型指針變量間可以相互賦值例例11.2 交換指針變量所指向的數據交換指針變量所指向的數據.C程序設計快速進階大學教程2021-12-1819課堂

16、練習課堂練習 1. 指針變量存儲的是什么?指針變量存儲的是什么?.C程序設計快速進階大學教程2021-12-182011.3 數組與指針數組與指針 一個變量有一個地址,一個數組包含若干元素,一個變量有一個地址,一個數組包含若干元素,每個數組元素都在內存中占用存儲單元,它們都每個數組元素都在內存中占用存儲單元,它們都有相應的地址。所謂數組的指針是指數組的起始有相應的地址。所謂數組的指針是指數組的起始地址,數組元素的指針是數組元素的地址。地址,數組元素的指針是數組元素的地址。 對數組元素也可以采用指針進行訪問,效率相對數組元素也可以采用指針進行訪問,效率相對更高。對更高。.C程序設計快速進階大學教

17、程2021-12-182111.3.1 一維數組與指針一維數組與指針一個數組是由連續的一塊內存單元組成的。一個數組是由連續的一塊內存單元組成的。數組名就是這塊連續內存單元的首地址(常量)。數組名就是這塊連續內存單元的首地址(常量)。int iArr5=1,2,3,4,5; int *pi; pi=&iArr0;.C程序設計快速進階大學教程2021-12-182211.3.1 一維數組與指針一維數組與指針 C語言規定,數組名代表數組的首地址,也語言規定,數組名代表數組的首地址,也就是第就是第0號元素的地址。因此,下面兩個語句等價:號元素的地址。因此,下面兩個語句等價: pi=&i

18、Arr0; pi=iArr; iArr數組名是整型數組名是整型常量地址常量地址 int i; iArr=&i;/*不可以,因為不可以,因為iArr為常量為常量*/.C程序設計快速進階大學教程2021-12-182311.3.1 一維數組與指針一維數組與指針1. 指針相關的運算符指針相關的運算符(1) 取地址運算符取地址運算符&:單目運算符:單目運算符(注意其優先級注意其優先級),其結合性為自右至左,其功能是取變量的地址。其結合性為自右至左,其功能是取變量的地址。(2) 間接訪問運算符間接訪問運算符*:單目運算符,其結合性為:單目運算符,其結合性為自右至左,用來表示指針變量所指的

19、變量。自右至左,用來表示指針變量所指的變量。(3) 賦值運算符賦值運算符=:可以給指針變量賦值。:可以給指針變量賦值。(4) 算術運算符算術運算符+、-、+、-。 +:地址表達式(:地址表達式(pi)+ 整型表達式(整型表達式(in),),結果為在結果為在pi地址值位置跳過地址值位置跳過in(pi所指類型字所指類型字節數)個字節后的地址。節數)個字節后的地址。.C程序設計快速進階大學教程2021-12-182411.3.1 一維數組與指針一維數組與指針1. 指針相關的運算符指針相關的運算符-:地址表達式(:地址表達式(pi)- 整型表達式(整型表達式(in),結果為),結果為在在pi地址值位置

20、跳回地址值位置跳回in(pi所指類型字節數)所指類型字節數)個字節后的地址。個字節后的地址。-:地址表達式(:地址表達式(pi1)-地址表達式(地址表達式(pi12),結果),結果為在為在pi2和和pi1相差的字節數相差的字節數(pi1所指類型字所指類型字節數)。節數)。pi1與與pi2必須指向相同數據類型。必須指向相同數據類型。+:地址變量(:地址變量(pi)+ 或者或者 +地址變量(地址變量(pi),),結果為在結果為在pi地址值位置跳過地址值位置跳過pi所指類型字節數個所指類型字節數個字節后的地址。分前字節后的地址。分前+和后和后+。-:地址變量(:地址變量(pi)- 或者或者 -地址變

21、量(地址變量(pi),結果),結果為在為在pi地址值位置跳回地址值位置跳回pi所指類型字節數個字節所指類型字節數個字節后的地址。分前后的地址。分前-和后和后-。.C程序設計快速進階大學教程2021-12-182511.3.1 一維數組與指針一維數組與指針1. 指針相關的運算符指針相關的運算符(5) 關系運算。支持關系運算。支持6種關系運算符,用來比較地址種關系運算符,用來比較地址的大小。例如:的大小。例如:&iArr1 &iArr3 為真;為真;piiArr+3為真(為真(pi的值為的值為iArr)。)。.C程序設計快速進階大學教程2021-12-182611.3.1 一維數組

22、與指針一維數組與指針1. 指針相關的運算符指針相關的運算符(5) 關系運算。關系運算。int iArr5=0,1,2,3,4; int *pi,*pi1,*pi2; pi=&iArr1; pi1=&iArr2; pi2=&iArr4;*pi+:由于:由于+和和*同優先級,結合方向自右而左,等價于同優先級,結合方向自右而左,等價于*(pi+)。先對。先對*pi,然后,然后pi加加1。表達式的值為。表達式的值為iArr1,pi的值為的值為&iArr2。*+pi:等價于:等價于*(+pi)。先。先pi加加1,然后,然后*pi。表達式的值為。表達式的值為iArr2,pi

23、的的值為值為&iArr2。 (*pi)+:先:先*pi,然后(,然后(*pi)加)加1。表達式的值為。表達式的值為iArr1+,iArr1的值的值改變了,改變了,pi的值為的值為&iArr1,pi的值未改變。的值未改變。 pi2-pi1:pi2和和pi1相差兩個整型數所占字節數的大小,它的返回值不是相相差兩個整型數所占字節數的大小,它的返回值不是相差字節數,而是相差整數的個數,所以值為差字節數,而是相差整數的個數,所以值為2。 上述算術運算符對簡單變量地址運算是無意義的,因為對于一個簡單變量上述算術運算符對簡單變量地址運算是無意義的,因為對于一個簡單變量x,&x+5計算

24、的結果地址不知道是哪個數據的地址。而數組空間是連續計算的結果地址不知道是哪個數據的地址。而數組空間是連續的,對于一個數組的,對于一個數組arr,arr+5就是就是arr5的地址。的地址。 .C程序設計快速進階大學教程2021-12-182711.3.1 一維數組與指針一維數組與指針1. 指針相關的運算符指針相關的運算符(5) 關系運算。關系運算。int iArr5=0,1,2,3,4; int *pi,*pi1,*pi2; pi=&iArr1; pi1=&iArr2; pi2=&iArr4;*pi+:由于:由于+和和*同優先級,結合方向自右而左,等價于同優先級,結合方向

25、自右而左,等價于*(pi+)。先對。先對*pi,然后,然后pi加加1。表達式的值為。表達式的值為iArr1,pi的值為的值為&iArr2。*+pi:等價于:等價于*(+pi)。先。先pi加加1,然后,然后*pi。表達式的值為。表達式的值為iArr2,pi的的值為值為&iArr2。 (*pi)+:先:先*pi,然后(,然后(*pi)加)加1。表達式的值為。表達式的值為iArr1+,iArr1的值的值改變了,改變了,pi的值為的值為&iArr1,pi的值未改變。的值未改變。 pi2-pi1:pi2和和pi1相差兩個整型數所占字節數的大小,它的返回值不是相相差兩個整型數所占字

26、節數的大小,它的返回值不是相差字節數,而是相差整數的個數,所以值為差字節數,而是相差整數的個數,所以值為2。 上述算術運算符對簡單變量地址運算是無意義的,因為對于一個簡單變量上述算術運算符對簡單變量地址運算是無意義的,因為對于一個簡單變量x,&x+5計算的結果地址不知道是哪個數據的地址。而數組空間是連續計算的結果地址不知道是哪個數據的地址。而數組空間是連續的,對于一個數組的,對于一個數組arr,arr+5就是就是arr5的地址。的地址。 .C程序設計快速進階大學教程2021-12-182811.3.1 一維數組與指針一維數組與指針2.引用數組元素引用數組元素 int iArr5=1,2

27、,3,4,5; int *pi; pi=iArr;(1) pi+i1和和iArr+i1就是就是iArri1的地址,或者說它們指向的地址,或者說它們指向iArr數組的第數組的第i個元素。個元素。(2) *(pi+i1)或或*( iArr+i1)就是就是pi+i1或或iArr+i1所指向的數組元所指向的數組元素,即素,即iArr i1。例如,。例如,*(pi+2)或或*(iArr+2)就是就是iArr2。(3) 指向數組指針變量可以帶下標,如指向數組指針變量可以帶下標,如pii1與與*(pi+i1)等價。等價。引入指針變量后,對于數組引入指針變量后,對于數組iArr,pi是指向數組的指針變量,是指

28、向數組的指針變量,其初值其初值pi=iArr。就可以用兩種方法來訪問數組元素。就可以用兩種方法來訪問數組元素:(1) 下標法,即用下標法,即用iArri1形式訪問數組元素,也可以用形式訪問數組元素,也可以用pii1訪問數組元素。訪問數組元素。(2) 指針法,即采用指針法,即采用*(iArr+i1)或或*(pi+i1)形式,用間接訪問形式,用間接訪問的方法來訪問數組元素。的方法來訪問數組元素。.C程序設計快速進階大學教程2021-12-182911.3.1 一維數組與指針一維數組與指針例例11.3 數組元素賦值并輸出(數組名下標法)數組元素賦值并輸出(數組名下標法)#include int ma

29、in() int iArr5,i1; for(i1=0;i15;i1+) iArri1=i1; for(i1=0;i15;i1+) printf(iArr%d=%dn,i1,iArri1); return 0;.C程序設計快速進階大學教程2021-12-183011.3.1 一維數組與指針一維數組與指針例例11.4 數組元素賦值并輸出(指針變量下標法)數組元素賦值并輸出(指針變量下標法)#include int main() int iArr5,i1; int *pi=iArr; /*pi為變量,為變量,iArr為常量為常量*/ for(i1=0;i15;i1+) pii1=i1; for(i

30、1=0;i15;i1+) printf(iArr%d=%dn,i1,pii1); return 0;.C程序設計快速進階大學教程2021-12-183111.3.1 一維數組與指針一維數組與指針例例11.5 數組元素賦值并輸出(數組名指針法)數組元素賦值并輸出(數組名指針法)#include int main() int iArr5,i1; for(i1=0;i15;i1+) *(iArr+i1)=i1; for(i1=0;i15;i1+) printf(iArr%d=%dn,i1,*(iArr+i1); return 0;.C程序設計快速進階大學教程2021-12-183211.3.1 一維

31、數組與指針一維數組與指針例例11.6 數組元素賦值并輸出(指針變量指針法)數組元素賦值并輸出(指針變量指針法)#include int main() int iArr5,i1; int *pi=iArr; for(i1=0;i15;i1+) *(pi+i1)=i1; for(i1=0;i15;i1+) printf(iArr%d=%dn,i1,*(pi+i1); return 0;.C程序設計快速進階大學教程2021-12-183311.3.1 一維數組與指針一維數組與指針例例11.7 數組元素賦值并輸出(指針變量指針移動法)數組元素賦值并輸出(指針變量指針移動法)#include int m

32、ain() int iArr5,i1; int *pi=iArr; for(i1=0;i15;i1+) *pi=i1;pi+; /*此時,此時,pi已經指向已經指向iArr4之后,輸出數組元素,之后,輸出數組元素,pi重新指回數組頭部重新指回數組頭部*/ pi=iArr; for(i1=0;i15;i1+) printf(iArr%d=%dn,i1,*pi);pi+; return 0;.C程序設計快速進階大學教程2021-12-183411.3.1 一維數組與指針一維數組與指針例例11.8 數組元素賦值并輸出(指針變量關系運算指針法)數組元素賦值并輸出(指針變量關系運算指針法)#includ

33、e int main() int iArr5,i1=0; int *pi=iArr; for(;piiArr+5;pi+,i1+)*pi=i1; /*此時,此時,pi已經指向已經指向iArr4之后,之后,為下面輸出數組,必須讓為下面輸出數組,必須讓pi重新指回數組頭部重新指回數組頭部*/ pi=iArr;i1=0; for(;piiArr+5;pi+,i1+) printf(iArr%d=%dn,i1,*pi); return 0;.C程序設計快速進階大學教程2021-12-183511.3.2 二維數組與指針二維數組與指針1. 理解二維數組理解二維數組 C語言對二維數組的存儲是行優先方式的,

34、對于整語言對二維數組的存儲是行優先方式的,對于整型二維數組型二維數組iArr。int iArr34=1,2,3,4,5,6,7,8,9,10,11,12.C程序設計快速進階大學教程2021-12-183611.3.2 二維數組與指針二維數組與指針1. 理解二維數組理解二維數組一個二維數組是以一維數組為元素構造的一維數組,也就是二一個二維數組是以一維數組為元素構造的一維數組,也就是二維數組可以看作一維數組,只不過該一維數組的每個元素維數組可以看作一維數組,只不過該一維數組的每個元素又是一個一維數組。如又是一個一維數組。如iArr,把,把iArr當作一維數組看待,當作一維數組看待,iArr有有3個

35、元素,分別為個元素,分別為iArr0,iArr1,iArr2,每個元,每個元素是一個有素是一個有4個整型元素構成的一維數組。個整型元素構成的一維數組。.C程序設計快速進階大學教程2021-12-183711.3.2 二維數組與指針二維數組與指針1. 理解二維數組理解二維數組iArri1有兩層含義,它既是有兩層含義,它既是“一維數組一維數組iArr”的數組的數組元素,又是一維數組名。元素,又是一維數組名。iArr1是數組是數組iArr的一個數組元素;的一個數組元素;同時,同時,iArr1是一個一維數組名,含有是一個一維數組名,含有iArr10,iArr11,iArr12,iArr13四個元素。四

36、個元素。.C程序設計快速進階大學教程2021-12-183811.3.2 二維數組與指針二維數組與指針1. 理解二維數組(對比一維)理解二維數組(對比一維)對于一維數組:對于一維數組:int iArr14=11,12,13,14;iArr1是一個其數組元素類型的常量地址,即是一個其數組元素類型的常量地址,即int型的型的常量地址常量地址,則,則iArr1+1的值會跳過一個數組元素,的值會跳過一個數組元素,即跳過即跳過4個字節(假定一個個字節(假定一個int,4個字節)。個字節)。對于當作一維數組的對于當作一維數組的“iArr”,iArr是一個其數組元素是一個其數組元素類型的常量地址,它的數組元

37、素為類型的常量地址,它的數組元素為iArri1(iArri1為為4個個int類型的一維數組),類型的一維數組),所以所以iArr為大小為為大小為4的一維整型數組型的常量地址的一維整型數組型的常量地址,則,則iArr+1的值會跳過一個數組元素,即跳過大小為的值會跳過一個數組元素,即跳過大小為4的一維整型數組(一行,的一維整型數組(一行,16個字節,假定一個個字節,假定一個int為為4個字節)。因此也把個字節)。因此也把iArr稱為稱為行地址行地址。.C程序設計快速進階大學教程2021-12-183911.3.2 二維數組與指針二維數組與指針1. 理解二維數組(對比一維)理解二維數組(對比一維)在

38、一維數組中在一維數組中iArr1中,中,iArr1i1等價于等價于*( iArr1+i1),代表取出第代表取出第i1個元素。在二維數組個元素。在二維數組iArr中,中,iArri1也等價于也等價于*(iArr+i1),iArri1和和*( iArr+i1)是一維是一維數組的數組名和首地址數組的數組名和首地址。因為。因為iArri1和和*(iArr+i1)為 一 維 數 組 , 為 整 數 類 型 常 量 地 址 , 所 以為 一 維 數 組 , 為 整 數 類 型 常 量 地 址 , 所 以iArri1+1和和*(iArr+i1)+1都會跳過一個整型數據都會跳過一個整型數據(一列,(一列,4個

39、字節,假定一個個字節,假定一個int為為4個字節),因個字節),因此,也把此,也把iArri1和和*(iArr+i1)稱為稱為列地址列地址。.C程序設計快速進階大學教程2021-12-184011.3.2 二維數組與指針二維數組與指針1. 理解二維數組(對比一維)理解二維數組(對比一維)行地址(一維數組地址),一次跳過一行,如行地址(一維數組地址),一次跳過一行,如iArr、iArr+i1、 &iArri1、&*(iArr+i1);列地址(數據元素),一次跳過一列,如列地址(數據元素),一次跳過一列,如 *iArr、*(iArr+i1)、iArri1。*(*(iArr+1)+2

40、): iArr+1一行指針,*(iArr+1)一列指針,*(iArr+1)+2 一行二列地址,*(*(iArr+1)+2) 一行二列地址間接訪問到iArr12,值為7。 .C程序設計快速進階大學教程2021-12-184111.3.2 二維數組與指針二維數組與指針例例11.9 行列地址行列地址#include int main() int iArr34=1,2,3,4,5,6,7,8,9,10,11,12; /*行地址行地址*/ printf(行地址行地址n); printf(iArr=%x , ,iArr); printf(iArr+1=%xn,iArr+1); printf(&iA

41、rr0=%x , ,&iArr0); printf(&iArr0+1=%xn,&iArr0+1); printf(&*(iArr+0)=%x , ,&*(iArr+0); printf(&*(iArr+0)+1=%xn,&*(iArr+0)+1); /*列地址列地址*/ printf(列地址列地址n); printf(*iArr=%x , ,*iArr); printf(*iArr+1=%xn,*iArr+1); printf(iArr0=%x , ,iArr0); printf(iArr0+1=%xn,iArr0+1); printf(

42、*(iArr+0)=%x , ,*(iArr+0); printf(*(iArr+0)+1=%xn,*(iArr+0)+1);程序運行結果:程序運行結果:行地址行地址iArr=12ff50 , iArr+1=12ff60&iArr0=12ff50 , &iArr0+1=12ff60&*(iArr+0)=12ff50 , &*(iArr+0)+1=12ff60列地址列地址*iArr=12ff50 , *iArr+1=12ff54iArr0=12ff50 , iArr0+1=12ff54*(iArr+0)=12ff50 , *(iArr+0)+1=12ff54數據元

43、素數據元素iArr12=7 /*訪問元素訪問元素*/ printf(數據元素數據元素n); printf(iArr12=%dn,*(*(iArr+1)+2); return 0;.C程序設計快速進階大學教程2021-12-184211.3.2 二維數組與指針二維數組與指針2.指向一維數組的指針指向一維數組的指針 對于一維數組對于一維數組int iArr14;可以把可以把iArr賦值給指向賦值給指向int型的指針變量。如:型的指針變量。如:int *pi1; pi1=iArr1;對于二維數組對于二維數組int iArr34=1,2,3,4,5,6,7,8,9,10,11,12;同樣可以把同樣可以

44、把iArr賦值給指向賦值給指向一維數組一維數組的指針變量,因為二維數的指針變量,因為二維數組的可以看成以一維數組為成員的一維數組。組的可以看成以一維數組為成員的一維數組。int (*pia)4;它表示它表示pia是一個指針變量,它指向包含是一個指針變量,它指向包含4個元素的一維數組。個元素的一維數組。然后就可以賦值:然后就可以賦值:pia=iArr;.C程序設計快速進階大學教程2021-12-184311.3.2 二維數組與指針二維數組與指針2.指向一維數組的指針指向一維數組的指針 pia指向第一個一維數組指向第一個一維數組iArr0,其值等于,其值等于iArr。而。而pia+1則指向一維數組

45、則指向一維數組iArr1。從前面的行列地址。從前面的行列地址分析可得出分析可得出*(pia+iRow)+iCol是二維數組是二維數組iRow行行iCol 列的元素的地址,而列的元素的地址,而*(*(pia+iRow)+iCol)則則是是iRow行行iCol列元素的值。列元素的值。.C程序設計快速進階大學教程2021-12-184411.3.2 二維數組與指針二維數組與指針2.指向一維數組的指針指向一維數組的指針 指向一維數組的指針變量定義的一般形式為:指向一維數組的指針變量定義的一般形式為: 類型說明符類型說明符 (*指針變量名指針變量名)數組長度數組長度;其中其中“類型說明符類型說明符”為所

46、指數組的數組元素類型,為所指數組的數組元素類型,“*”表示其后的變量是指針類型,表示其后的變量是指針類型,“數組長度數組長度”表示表示所指向一維數組的長度。應注意所指向一維數組的長度。應注意“(*指針變量名指針變量名)”兩邊的括號不可少,如缺少括號則表示是指針數兩邊的括號不可少,如缺少括號則表示是指針數組組(后面介紹后面介紹),意義就完全不同了。,意義就完全不同了。可以這樣理解:先看小括號內,有可以這樣理解:先看小括號內,有*號是在定義指針變號是在定義指針變量;然后是中括號,表示指針變量指向該長度的量;然后是中括號,表示指針變量指向該長度的一維數組;最后看類型說明符,表示該數組的每一維數組;最

47、后看類型說明符,表示該數組的每個元素為類型說明符說明的類型。個元素為類型說明符說明的類型。.C程序設計快速進階大學教程2021-12-184511.3.2 二維數組與指針二維數組與指針例例11.10 一個學習小組有一個學習小組有5個人,每個人有個人,每個人有3門課的考試成績。要求利用函門課的考試成績。要求利用函數計算每門課程的平均成績數計算每門課程的平均成績如:如: 趙趙錢錢 孫孫李李張張Math 80 61598576C 7565638777English 9271709085問題分析:問題分析:可定義一個二維數組可定義一個二維數組score35存儲五個人存儲五個人3門課的成績。再定義一個一

48、維門課的成績。再定義一個一維數組數組courseAverage3存儲計算所得各門課平均成績。存儲計算所得各門課平均成績。要完成的要接收一門課程(數組的一行)為參數,所以應該設指向一維數要完成的要接收一門課程(數組的一行)為參數,所以應該設指向一維數組的指針為參數。組的指針為參數。算法描述:算法描述:1. 依次輸入每門課程的成績(每門課一行)。依次輸入每門課程的成績(每門課一行)。2. 計算每門課程平均成績,即對每行計算平均成績(函數完成)。計算每門課程平均成績,即對每行計算平均成績(函數完成)。3. 輸出每門課程平均成績。輸出每門課程平均成績。.C程序設計快速進階大學教程2021-12-184

49、611.3.2 二維數組與指針二維數組與指針#include int main() int i,j; float sum; float score35; /*存儲成績存儲成績*/ float courseAverage3;/*存儲每門課程平均成績存儲每門課程平均成績*/ float average(float (*p)5); /*輸入成績輸入成績*/ for(i=0;i3;i+) /*行(每門課)循環行(每門課)循環*/ for(j=0;j5;j+) /*行內每列循環行內每列循環*/ scanf(%f,&scoreij); /*輸出成績表輸出成績表*/ for(i=0;i3;i+) /

50、*行(每門課)循環行(每門課)循環*/ for(j=0;j5;j+) /*行內每列循環行內每列循環*/ printf(%ft,scoreij); printf(n); /*每行結束輸出一個換行每行結束輸出一個換行*/ /*計算平均成績計算平均成績*/ for(i=0;i3;i+) /*行(每門課)循環行(每門課)循環*/ courseAveragei=average(score+i);/*每行地址為參數每行地址為參數*/ /*輸出成績表輸出成績表*/ for(i=0;i3;i+) printf(%ft,courseAveragei); return 0;/*計算平均成績,參數為行地址計算平均成

51、績,參數為行地址(指向一維數組指針)(指向一維數組指針)*/float average(float (*p)5) int i; float sum=0; for(i=0;i5;i+) /* *p轉為列地址,轉為列地址,(*p+i)偏移偏移i,間接訪問間接訪問*(*p+i) */sum+=*(*p+i); return sum/5;.C程序設計快速進階大學教程2021-12-184711.3.3 指針數組指針數組一個數組的元素值為指針,則該數組稱為一個數組的元素值為指針,則該數組稱為指針數組指針數組。指針數組所有元素都必須是指向相同數據類型的指針。指針數組所有元素都必須是指向相同數據類型的指針。

52、指針數組定義的一般形式為:指針數組定義的一般形式為: 類型說明符類型說明符 *數組名數組名數組長度數組長度;可以這樣理解:先看可以這樣理解:先看“數組名數組名數組長度數組長度”,表示定義,表示定義一個該長度的一維數組;然后看一個該長度的一維數組;然后看“類型說明符類型說明符 *”,表示該數組的每個元素為指向該類型說明符類型表示該數組的每個元素為指向該類型說明符類型的指針。的指針。例如:例如:int *pa3;表示表示pa是一個指針數組,它有三個數組元素,每個元是一個指針數組,它有三個數組元素,每個元素值都是一個指針,指向整型變量。素值都是一個指針,指向整型變量。.C程序設計快速進階大學教程20

53、21-12-184811.3.3 指針數組指針數組例例11.11 通過指針數組訪問二維數組通過指針數組訪問二維數組#include int main() int iArr34=1,2,3,4,5,6,7,8,9,10,11,12; int *pa3;/*指針數組,每個成員都是指向指針數組,每個成員都是指向int型的指針型的指針*/ int iRow; pa0=iArr0; /*iArr0為一維數組名,為為一維數組名,為int型地址型地址*/ pa1=iArr1; pa2=iArr2; for(iRow=0;iRow3;iRow+) printf(%d,%d,%d,%dn,*paiRow,*(p

54、aiRow+1), *(paiRow+2),*(paiRow+3); return 0;程序運行結果:程序運行結果:1,2,3,45,67,89,10,11,12 .C程序設計快速進階大學教程2021-12-184911.3.3 指針數組指針數組例例11.11 通過指針數組訪問二維數組通過指針數組訪問二維數組.C程序設計快速進階大學教程2021-12-185011.3.4 指向指針的指針指向指針的指針 對一維數組對一維數組int iArr15;數組成員類型是數組成員類型是int,一維數組名,一維數組名iArr1是指向是指向int的指的指針常量,是指向其成員類型的指針常量。針常量,是指向其成員類

55、型的指針常量。對于指針數組對于指針數組int *pa3;數組成員類型是數組成員類型是int *,一維數組名,一維數組名pa是指向是指向int *的指的指針常量,同樣是指向其成員類型(指向整形的指針常量,同樣是指向其成員類型(指向整形的指針)的指針常量,也就是說針)的指針常量,也就是說pa是是指向指向指向整型指指向整型指針針的指針的指針。.C程序設計快速進階大學教程2021-12-185111.3.4 指向指針的指針指向指針的指針 指向指針的指針定義的一般形式為:指向指針的指針定義的一般形式為:類型說明符類型說明符 *變量名變量名;可以這樣理解:先看可以這樣理解:先看“*變量名變量名”,表示定義

56、一個指針,表示定義一個指針變量;然后看變量;然后看“類型說明符類型說明符 *”,表示該指針變量,表示該指針變量為指向為指向“類型說明符類型說明符 *”類型的指針。類型的指針。char c1=A;char *pc;char *ppc;pc=&c1;ppc=&pc; c1、*pc、*ppc的值都為的值都為A;分別為直接訪問、間接訪問、二級間接訪問分別為直接訪問、間接訪問、二級間接訪問.C程序設計快速進階大學教程2021-12-185211.3.4 指向指針的指針指向指針的指針 例例11.12 不移動數據,通過改變指針使得不移動數據,通過改變指針使得追加數據有序追加數據有序#incl

57、ude int main() int iArr5=1,5,7,9; int *pa5=&iArr0,&iArr1,&iArr2,&iArr3,0; int *ppi,i1; /*-輸出原來輸出原來4個有序數據個有序數據-*/ printf(輸出原來輸出原來4個有序數據個有序數據n); ppi=pa;/*ppi和和pa同樣為指向整型的指針的指針同樣為指向整型的指針的指針 */ for(i1=0;i14;i1+) printf(%dn,*ppi); ppi+; /*-追加一個數據,原來數據不動,追加一個數據,原來數據不動,調整指針數組,通過指針數組訪問調整指針數組,

58、通過指針數組訪問仍然有序仍然有序-*/ iArr4=3; pa1=&iArr4; pa2=&iArr1; pa3=&iArr2; pa4=&iArr3; /*-輸出追加輸出追加1個之后的個之后的5個有序數據個有序數據-*/ ppi=pa;/*指針回到前面指針回到前面*/ printf(輸出追加之后輸出追加之后5個有序數據個有序數據n); for(i1=0;i15;i1+) printf(%dn,*ppi);ppi+; return 0;程序運行結果:程序運行結果:輸出原來輸出原來4個有序數據個有序數據1579輸出追加輸出追加1個之后的個之后的5個有序數據個有序數

59、據13579.C程序設計快速進階大學教程2021-12-185311.3.4 指向指針的指針指向指針的指針 .課堂練習課堂練習1.指針類型作用?指針類型作用?2指針與下標?指針與下標?3.不用指針可以嗎?不用指針可以嗎?4.用指針方法實現一個一維數組的轉置。用指針方法實現一個一維數組的轉置。C程序設計快速進階大學教程2021-12-1854.C程序設計快速進階大學教程2021-12-185511.4.1 指針作函數參數指針作函數參數 例例11.13 交換變量數據交換變量數據交換形參指針變量交換形參指針變量#include void s *pi1Copy,int *pi2Copy) int *p

60、iTemp; piTemp=pi1Copy; pi1Copy=pi2Copy; pi2Copy=piTemp;int main() int i1=3,i2=4; int *pi1,*pi2; pi1=&i1; pi2=&i2; s); printf(i1=%dni2=%dn,i1,i2); return 0; .C程序設計快速進階大學教程2021-12-185611.4.1 指針作函數參數指針作函數參數 例例11.13 交換變量數據交換變量數據交換形參指針變量交換形參指針變量.C程序設計快速進階大學教程2021-12-185711.4.1 指針作函數參數指針作函數參數 例例11.14 交換形參指針變量所指向的變量交換形參指針變量所指向的變量#include void s *pi1Copy,int *pi2Copy) int iTemp=0; /*交換形參指針變量所指向的變量,交換形參指針變量所指向的變量, 實參不受影響,但是實參所指向實參不受影響,但是實參所指向 數據改變了數據改變了*/ iTemp=*pi1Copy; /*用的間接訪問,實際上是訪問用的間接訪問,實際上是訪問i1、i2*/ *pi1Copy=*pi2Cop

溫馨提示

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

評論

0/150

提交評論