第八章指針_第1頁
第八章指針_第2頁
第八章指針_第3頁
第八章指針_第4頁
第八章指針_第5頁
已閱讀5頁,還剩56頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第1頁第八章第2頁l 主要內容主要內容8.1 地址和指針地址和指針8.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量8.3 一維數組的指針和指向一維數組元素的一維數組的指針和指向一維數組元素的指針變量指針變量 8.4 二維數組的指針和指向二維數組的指針變量二維數組的指針和指向二維數組的指針變量 8.5 字符串的指針和指向字符串的指針變量字符串的指針和指向字符串的指針變量8.6 指針數組指針數組第3頁l本章要點本章要點第4頁8.1 地址和指針 內存區的每一個字節有一個編號,這就是內存區的每一個字節有一個編號,這就是“地址地址” ” 。如。如果在程序中定義了一個變量,在對程序進行

2、編譯時,系統就果在程序中定義了一個變量,在對程序進行編譯時,系統就會給這個變量分配內存單元。會給這個變量分配內存單元。 如如intint a a;編譯時系統為;編譯時系統為a a分配兩個字節大小的存儲空間,分配兩個字節大小的存儲空間,假設這兩個字節的地址編碼分別為假設這兩個字節的地址編碼分別為401401、402402,其中第一個字,其中第一個字節的編碼節的編碼401401指示了變量指示了變量a a所在存儲單元的起始位置,只要找所在存儲單元的起始位置,只要找到到401401,就能找到變量,就能找到變量a a。為了形象地描述地址與存儲單元的。為了形象地描述地址與存儲單元的這種指向關系,我們把它稱

3、為指針,也就是說這種指向關系,我們把它稱為指針,也就是說地址就是指針地址就是指針。 第5頁. .按按變量地址變量地址存取變存取變量值的方式稱為量值的方式稱為“直接直接訪問訪問” ” 方式。方式。intint i i,j j,k k;k k;printf(%d,kprintf(%d,k); ; 2. 2. 另一種存取變量值另一種存取變量值的方式稱為的方式稱為“間接訪問間接訪問”的方式。即的方式。即: :將變量將變量的地址存放在另一個變的地址存放在另一個變量中。指針就是這個存量中。指針就是這個存放地址的變量。放地址的變量。第6頁在語言中,指針是一種特殊的變量,它是在語言中,指針是一種特殊的變量,它

4、是存放地址的。存放地址的。將數值將數值3 3送到變量中,送到變量中,可以有可以有兩種方法兩種方法:1.1.將將3 3送到變量送到變量i i所標所標志的單元中,見圖志的單元中,見圖(a)(a)。2.2.將將3 3送到變量送到變量i_pointeri_pointer所指向的單所指向的單元中(即元中(即i i所標志的單所標志的單元)中,見圖元)中,見圖(b)(b)。第7頁v變量的指針和指針變量的概念v指針變量的定義和引用v指針的運算v指向變量的指針變量的應用8.2 變量的指針和指向變量的指針變量第8頁 一個變量的地址稱為該變量的一個變量的地址稱為該變量的“指針指針”。例。例如,地址如,地址20002

5、000是變量的指針。是變量的指針。如果有一個變量專門用來存放另一變量的地址如果有一個變量專門用來存放另一變量的地址(即指針)的,則它稱為(即指針)的,則它稱為“指針變量指針變量”。上述的。上述的i_pointeri_pointer就是一個指針變量。就是一個指針變量。8.2.1 變量的指針和指針變量的概念:變量的指針和指針變量的概念:注:注:指針是一個地址,指針變量的值(即指針變指針是一個地址,指針變量的值(即指針變量中存放的值)也是地址(即指針)。而指針變量中存放的值)也是地址(即指針)。而指針變量是存放地址的變量。量是存放地址的變量。第9頁如如i_pointeri_pointer為指針為指針

6、變量,則變量,則( (* *i_pointeri_pointer) )是是i_pointeri_pointer所指向的所指向的變量,如圖所示。變量,如圖所示。則:則:i=3;i=3;等價于等價于 * *i_pointeri_pointer=3;=3;這兩個語句的含義這兩個語句的含義是是將將3 3賦給指針變量賦給指針變量i_pointeri_pointer所指向的所指向的變量。變量。第10頁定義指針變量的一般形式為:定義指針變量的一般形式為:類型說明符類型說明符* *指針變量名;指針變量名;其中:其中:類型說明符指的是指針變量指向的變量的數據類型,類型說明符指的是指針變量指向的變量的數據類型,“

7、* *”表示隨后的變量是指針變量。表示隨后的變量是指針變量。下面都是合法的定義:下面都是合法的定義:float float * *pointer_pointer_; char char * *pointer_pointer_; 可以用賦值語句使一個指針變量得到另一可以用賦值語句使一個指針變量得到另一個變量的地址,從而使它指向該變量。個變量的地址,從而使它指向該變量。例如:例如:pointer_pointer_;pointer_pointer_;8.2.2 定義一個指針變量定義一個指針變量第11頁在定義指針變量時要注意兩點:在定義指針變量時要注意兩點:(1)(1)指針變量前面的指針變量前面的“*

8、 *”,表示該變量的類型為指針型,表示該變量的類型為指針型變量。變量。例例: : float float * *pointer_1pointer_1;指針變量名是指針變量名是pointer_1pointer_1 ,而不是,而不是* * pointer_1pointer_1 。 (2) (2) 在定義指針變量時必須指定其類型,在定義指針變量時必須指定其類型,其類型用來指其類型用來指定該指針變量定該指針變量可以指向的變量的類型。可以指向的變量的類型。注:注:需要特別注意的是,只有整型變量的地址才能放到需要特別注意的是,只有整型變量的地址才能放到指向整型變量的指針變量中。下面的賦值是錯誤的指向整型變

9、量的指針變量中。下面的賦值是錯誤的 float a; float a; intint * * pointer_1; pointer_1; pointer_1=&a; pointer_1=&a; 第12頁8.2.2 指針變量的引用指針變量的引用 注意注意:指針變量中只能存放地址(指針),不要將一指針變量中只能存放地址(指針),不要將一個整數(或任何其他非地址類型的數據)賦給一個個整數(或任何其他非地址類型的數據)賦給一個指針變量。指針變量。 與指針變量有關的運算符:與指針變量有關的運算符:1.1.:其功能是返回操作數的內存地址。其功能是返回操作數的內存地址。2.2.* *:表示的是地址對應單元中

10、的內容。表示的是地址對應單元中的內容。注注:1.1.操作的對象為一個操作的對象為一個變量變量,而,而* *操作的對象為操作的對象為一個變量的一個變量的地址地址。2.2.對指針變量對指針變量不能不能直接賦值:如:直接賦值:如:intint * *pp; pp; pp=10;(10pp=10;(10是整是整數,不是地址數,不是地址) )3.3.、* *優先級相同,結合方向自右向左。優先級相同,結合方向自右向左。第13頁#include #include voidvoidmain( )main( ) intint ,;,; intint* *pointer_pointer_,* *pointer_p

11、ointer_; 100100;1010; pointer_pointer_;/ /* *把變量的地址賦給把變量的地址賦給pointer_1 pointer_1 * */ / pointer_ pointer_;/ /* *把變量的地址賦給把變量的地址賦給pointer_pointer_* */ / printfprintf(%d,%dnd,%dn, ,);); printfprintf(%d,%dnd,%dn,* *pointer_1,pointer_1,* *pointer_2)pointer_2); 運行結果為:運行結果為:100100,1010100100,1010 例例8. 通過指針

12、變量訪問整型變量。通過指針變量訪問整型變量。第14頁第15頁例例1 1: main()main() intint i; i; intint * *j;j; i=20; i=20; j=&i; j=&i; printf(“iprintf(“i=%d,=%d,* *j=%j=%d”,id”,i, ,* *j);j); 運行情況如下:運行情況如下:i=20,i=20,* *j=20 j=20 第16頁例例2 2:main()main() intint i; i; intint * *pp;pp; i=100; pp=&i; i=100; pp=&i; printf(“iprintf(“i=%d,=%

13、d,* *pp=%pp=%dn”,idn”,i, ,* *pp);pp); * *pp=20;pp=20; printf(“iprintf(“i=%d,=%d,* *pp=%pp=%dn”,idn”,i, ,* *pp);pp); 運行情況如下:運行情況如下:i=100,i=100,* *pp=100pp=100i=20,i=20,* *pp=20pp=20第17頁對對“”和和“* *”運算符說明:運算符說明:如果已執行了語句:如果已執行了語句:pointer_pointer_;(1)(1)* * pointer_pointer_的含義是什么?的含義是什么? “ “”和和“* *”兩個運算符的

14、優先級別相同,但按兩個運算符的優先級別相同,但按自右而左方向結合。因此,自右而左方向結合。因此,* * pointer_pointer_與相與相同,即變量同,即變量a a的地址。的地址。 如果有如果有pointer_2 pointer_2 * * pointer_pointer_ ;它的作;它的作用是將(的地址)賦給用是將(的地址)賦給pointer_2 pointer_2 ,如果,如果pointer_2pointer_2原來指向,經過重新賦值后它已不再指原來指向,經過重新賦值后它已不再指向了,而指向了。向了,而指向了。第18頁第19頁(2) (2) * *的含義是什么?的含義是什么? 先進行

15、運算,得的地址,再進行先進行運算,得的地址,再進行* *運算。運算。* *和和* *pointer_pointer_的作用是一樣的,它們都等價于的作用是一樣的,它們都等價于變量。即變量。即* *與等價。與等價。(3)(3) (* *pointer_pointer_)+相當于相當于+。第20頁例例8.2 8.2 輸入和兩個整數,按先大后小的順序輸出輸入和兩個整數,按先大后小的順序輸出 和。和。#include #include void mainvoid main()() intint * *p1p1,* *p2p2,* *p p,a,ba,b; scanfscanf(%d,%dd,%d,& &

16、a,&ba,&b);); p1p1;p2p2; ifif()()p1p1;p1p1p2p2;p2p2p p; printfprintf(=%d,=%d,=%d=%d, ,);); printfprintf(max=%max=%d,mind,min=%=%dndn,* *1,1,* *2 2);); 第21頁運行情況如下:運行情況如下:, ,maxmax,minmin當輸入,時,由于,將當輸入,時,由于,將和交換。交換前的情況見圖(),交和交換。交換前的情況見圖(),交換后見圖()。換后見圖()。第22頁v一、指針的賦值運算:一、指針的賦值運算:指針變量指向某個已經存在的對象。v二、指針的加減運

17、算:二、指針的加減運算:一個指針加減一個整數得到一個新的指針。1.int *p1;假設指針變量p1的地址是401(401是內存中一片連續的int型變量的存儲空間的起始地址),則p1+n表示地址401+n*2(n是一個整數)。2.float *p2;假設指針變量p2的地址是701(同上,701是內存中一片連續的float型變量的存儲空間的起始地址),則p2+n表示地址701+n*4(n是一個整數)。3.char *p3;假設指針變量p3的地址是901(同上,901是內存中一片連續的char型變量的存儲空間的起始地址),則p2+n表示地址701+n *1(n是一個整數)。 從以上可以得出,一個指針

18、加減一個整數得到的是一個新的指針。從以上可以得出,一個指針加減一個整數得到的是一個新的指針。新的指針新的指針=原指針原指針nk。k的值取決于地址指向的變量數據類型。的值取決于地址指向的變量數據類型。變量數據類型為變量數據類型為char型時,型時,k=1;變量數據類型為;變量數據類型為int型時,型時,k=2;變量數據類型為變量數據類型為float型時,型時,k=4;變量數據類型為;變量數據類型為double型時,型時,k=8;8.2.3 指針的運算指針的運算int *p,x; p=&x; /*p指向x*/float *p1,*p2,y; p1=p2=&y; /*p1、p2均指向y*/第23頁8

19、.2.3 指針的運算指針的運算三、指針的自增、自減運算。三、指針的自增、自減運算。1.p+1.p+:p p指向下一個元素,即指向下一個元素,即a1a1,如再執行,如再執行* *p p,取出下一個元素取出下一個元素a1a1的值。的值。2.2.* *p+p+等價于等價于* *(p+)(p+):作用是先得到作用是先得到p p指向的變量的指向的變量的值值( (即即* *p)p),然后再使,然后再使p+1 pp+1 p。3.3.* *(p+)(p+)與與* *(+p)(+p)作用不同:作用不同:前者先取前者先取* *p p的值,再的值,再使使p p加加1 1。后者是先使。后者是先使p p加加1 1,再取

20、,再取* *p p。若。若p p初值為初值為a(a(即即&a0)&a0),輸出,輸出* *(p+)(p+)時,得到時,得到a0a0的值,而輸出的值,而輸出* *(+p)(+p)時,得到時,得到a1a1的值。的值。4.(4.(* *p)+p)+:表示表示p p所指向的元素值加所指向的元素值加1 1,如,如p=ap=a,即,即(a0)+(a0)+,如,如 a0=3a0=3,則,則(a0)+(a0)+的值為的值為4 4。注意:注意:是元素值加是元素值加1 1,而不是指針值加,而不是指針值加1 1。第24頁v四、兩個指向數據類型相同的變量的指針可以做關四、兩個指向數據類型相同的變量的指針可以做關系運算

21、。系運算。設設pxpx、pypy是指向具有相同數據類型且連續存儲的一組數據的指是指向具有相同數據類型且連續存儲的一組數據的指針。針。如:如:pxpx pypy 說明說明pxpx指向變量的存儲單元地址大于指向變量的存儲單元地址大于pypy指向變量指向變量的存儲單元地址。的存儲單元地址。如:如:pxpx pxpx,則,則py-pxpy-px是兩個指針之間的數據個數,是兩個指針之間的數據個數,注意:注意:( (py-pxpy-px) )不是地址值。不是地址值。8.2.3 指針的運算指針的運算第25頁8.2.4 指向變量的指針變量的應用用指向變量的指針變量編程時,需考慮下面幾點:v定義指針變量時的類型

22、說明符指的是指針變量指向變量的數據類型。v在用指針指向運算符“ * ”之前,確保指針變量已經指向確定的對象。vC函數間的數據傳遞是“單向值傳遞”。1.如果函數間傳遞的是非地址值,函數的形參只能是非指針變量,函數調用結束,形參隨之消失。2.如果函數間傳遞的是地址值,函數的形參必須是指針變量,實參與形參的結合使得實參與形參指向同一個變量,函數中的形參隨著函數調用的結束而消失,但形參指向的變量依然存在,原因是形參指向的變量不在被調用的函數中,它在主調函數中。第26頁8.2.4 指向變量的指針變量的應用指向變量的指針變量的應用指針變量作為函數參數指針變量作為函數參數例例8 . 3 輸入和兩個整數,按先

23、大后小的順序輸出。輸入和兩個整數,按先大后小的順序輸出。void swap(int *p1,int *p2) int t; t*p1; *p1*p2; *p2t;void mainvoid main()()intint ,;,;intint * *pointer_pointer_,* *pointer_pointer_; scanfscanf(,);,);pointer_pointer_; pointer_2pointer_2;if(if()swap)swap(pointer_pointer_,pointer_2pointer_2););printfprintf(, ,);,); 運行情況如下

24、:運行情況如下:5 5,999 9,5 5 第27頁例例8.8. 輸入、輸入、b b、3 3個整數,按大小順序輸出。個整數,按大小順序輸出。void swapvoid swap(intint * *pt1pt1, intint * *pt2pt2) intint temp temp; temptemp* *pt1pt1; * *pt1pt1* *pt2pt2; * *pt2pt2temptemp; void exchangevoid exchange(intint * *q1q1,intint * *q2q2,intint * *q3q3) if if(* *q1q1* *q2q2) swap

25、swap(q1q1,q2q2);); ifif(* *q1q1* *q3q3) swapswap(q1q1,q3q3);); ifif(* *q2q2* *q3q3) swapswap(q2q2,q3q3);); 第28頁void mainvoid main()()void exchangevoid exchange(intint * *q1q1,intint * *q2q2,intint * *q3q3); ;intint ,b,b,,* *p1p1,* *p2p2,* *p3p3;scanfscanf(%,% %,% %,& &, &, &, &, &););p1p1;p2p2;p3p3;

26、exchange exchange (p1p1,p2p2,p3p3););printfprintf(, , , , ,);); 運行情況如下:運行情況如下:9,0,109,0,1010,9,010,9,0 第29頁8.3一維數組的指針和指向一維數組元素的指針變量 數組的指針:數組的指針:數組的首地址。數組的首地址。一維數組的指針:一維數組的首地址,也就一維數組的指針:一維數組的首地址,也就是一維數組中第一個元素的地址。是一維數組中第一個元素的地址。C語言規定:數組名代表數組的首地址。語言規定:數組名代表數組的首地址。 若有:若有:int a10; 則:則:a 與與 a0 是等價的是等價的 數組

27、元素的指針:數組元素的指針:數組元素的地址。數組元素的地址。 指向一維數組元素的指針變量:存放一維數組指向一維數組元素的指針變量:存放一維數組首地址或數組元素地址的變量。首地址或數組元素地址的變量。第30頁8.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 一維數組的首地址加上偏移量一維數組的首地址加上偏移量x即可得到其他數即可得到其他數組元素的地址。組元素的地址。 例如:例如: int a10, *p; p=a; /* 等價于等價于 p=&a0 */ 則有:則有: &a1 等價于等價于 a+1 或或 p+1 &ai 等價于等價于 a+i 或或 p

28、+i 注意:注意:p+i指向數組的第指向數組的第i個元素,而不是簡單地個元素,而不是簡單地使指針變量使指針變量p的值加的值加i。其所代表的地址實際上是其所代表的地址實際上是p+isize(size為一個數組元素所占的字節數)為一個數組元素所占的字節數)第31頁8.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 訪問一個數組元素主要有兩種形式:訪問一個數組元素主要有兩種形式:下標法:下標法:用用 ai 的的形式存取數組元素。形式存取數組元素。指針法:指針法:用用 *(a+i) 或或 *(p+i) 的形式存取數組元素。的形式存取數組元素。 其中其中a是

29、一維數組名,是一維數組名,p是指向數組元素的指針變量。是指向數組元素的指針變量。p的初值為數組的初值為數組a的的首地址,可以通過指針變量賦值首地址,可以通過指針變量賦值或加或加/減一個整數使減一個整數使p指向不同的數組元素。指向不同的數組元素。 例如:例如:int a10, *p=a; p+; /* p指向指向a1 */ p=a+5; /* p指向指向a5 */第32頁例例 通過下標法存取數組元素通過下標法存取數組元素#include void main( ) int a10, i; for(i=0; i10; i+) scanf(%d, &ai); for(i=0; i10; i+) pri

30、ntf(%5d, ai); printf(n);8.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第33頁例例 通過數組名計算元素地址存取數組元素通過數組名計算元素地址存取數組元素#include void main( ) int a10, i; for(i=0; i10; i+) scanf(%d, a+i); for(i=0; i10; i+) printf(%5d, *(a+i); printf(n);8.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第34頁例例 通過指針變量存取數組元素通過

31、指針變量存取數組元素#include void main( ) int a10, *p; for(p=a; pa+10; p+) scanf(%d, p); for(p=a; pa+10; p+) printf(%5d, *p); printf(n);8.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第35頁 用指針法訪問數組元素的注意事項:用指針法訪問數組元素的注意事項:數組名是一個常量,不允許重新賦值。數組名是一個常量,不允許重新賦值。p+i和和a+i均表示數組元素均表示數組元素ai的地址,均指向的地址,均指向ai。 *(p+i)和和*(a+

32、i)均表示均表示p+i和和a+i所指對象的內所指對象的內容,即容,即ai。 *p+ 等價于等價于 *(p+),其作用是先得到其作用是先得到*p,再使再使p=p+1。8.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第36頁 用指針法訪問數組元素的注意事項:用指針法訪問數組元素的注意事項:(*p)+:表示將表示將p所指向元素的值加所指向元素的值加1。 例如:例如: int a5=0, 2, 4, 6, 8, *p; p=a+2; (*p)+; printf(%dn, *p); 程序段輸出結果為:程序段輸出結果為:58.3.1 一維數組的指針和指向一

33、維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第37頁例例 分析下面程序的輸出結果分析下面程序的輸出結果#include void main( ) int a5=0, 2, 4, 6, 8, *p, i; p=a; (*p)+; p=a+1; +(*p); p=a+2; (*p)-; p=a+3; -(*p); for(i=0; i=4; i+) printf(%5d, ai); printf(n);程序運行結果程序運行結果: 1 3 3 5 88.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第38頁 用指針法訪問數組元素的注

34、意事項:用指針法訪問數組元素的注意事項: 實際上是變址運算符,即編譯時是將數組元素實際上是變址運算符,即編譯時是將數組元素ai處理成處理成*(a+i)的。因此指向數組元素的指針變量也可的。因此指向數組元素的指針變量也可帶下標。帶下標。 例如:例如:*(p+i) 可以表示成可以表示成 pi。 注意:如果注意:如果p不指向不指向a0,則,則pi和和ai是不一樣的。是不一樣的。 例如:例如:int a10, *p; p=a+3; /* p指向指向a3 */ p3=25; /* p3等價于等價于a6 */ 這種方式容易出錯,一般不提倡使用。這種方式容易出錯,一般不提倡使用。8.3.1 一維數組的指針和

35、指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第39頁數組元素的訪問小結數組元素的訪問小結int i, a10, *p=a;表 現 形 式含 義&a0 a p一維數組首地址&ai a+i p+i一維數組下標為 i 的元素地址a0 *a *p一維數組下標為 0 的元素的值ai *(a+i) pi *(p+i)一維數組下標為 i 的元素的值8.3.1 一維數組的指針和指向一維數組一維數組的指針和指向一維數組元素的指針變量元素的指針變量 第40頁8.3.2指針變量和數組名作為函數參數指針變量和數組名作為函數參數 一維數組名作為函數參數的特點:一維數組名作為函數參數的特點: 作

36、為實參的數組名表示數組的首地址,是一個作為實參的數組名表示數組的首地址,是一個地址常量;地址常量; 作為形參的數組名并不表示數組的首地址,它作為形參的數組名并不表示數組的首地址,它不是一個地址常量而是一個指針變量;不是一個地址常量而是一個指針變量; 在函數調用時,實參向形參傳遞數組的首地址;在函數調用時,實參向形參傳遞數組的首地址; 可以用指向數組元素的指針變量作為函數參數。可以用指向數組元素的指針變量作為函數參數。第41頁例例 用選擇法對用選擇法對10個整數由大到小排序個整數由大到小排序#include void sort(int , int);void main( ) int *p, i,

37、 a10; printf(Input data:n); for(i=0; i10; i+) scanf(%d, a+i); sort(a, 10); for(p=a; pa+10; p+) printf(%5d, *p); printf(n);void sort(int x , int n) int *x_end, *y, temp; x_end = x+n;for( ; xx_end-1; x+) for(y=x+1; y*x) temp=*x; *x=*y; *y=temp; 8.3.2 指針變量和數組名作為函數參數指針變量和數組名作為函數參數 第42頁8.4.1二維數組的地址對于一維數組

38、:(1)數組名array表示數組的首地址, 即array0的地址;(2)數組名array是地址常量(3)array+i是元素arrayi的地址(4)arrayi *(array+i)arrayint array10;8.4 二維數組的指針和指向二維二維數組的指針和指向二維數組的指針變量數組的指針變量第43頁對于二維數組:(1)a是數組名。包含三個元素 :a0,a1,a2(2)每個元素ai又是一個一維數組,包含4個元素: ai0、 ai1、 ai2、 ai3int a34;aa+1a+2*(*(a+0)+1)*(a0+1)a0a1a22000201020202000200420102014202

39、02024a00a01a10a11a20a21a02a03a12a13a22a23a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+18.4.1二維數組的地址二維數組的地址第44頁對二維數組對二維數組 intint a34, a34,有有va-a-二維數組的首地址,即第二維數組的首地址,即第0 0行的首行的首地址地址va+i-a+i-第第i i行的首地址行的首地址vai ai * *(a+i)(a+i)-第第i i行第行第0 0列元素的地列元素的地址址vai+j ai+j * *(a+i)+j(a+i)+j - -第第i i行第行第j j列元素的列元素的地址地址v* *(a

40、i+j) (ai+j) * *( (* *(a+i)+j) (a+i)+j) aij aijva+i &ai,表示第表示第i行首地址,指向行行首地址,指向行vai *(a+i) &ai0,表示第表示第i行第行第0列元素地址,指向列列元素地址,指向列a0a1a2200020102020200020042010201420202024a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+28.4.1二維數組的地址二維數組的地址第45頁二維數組元素表示形式:(1)a12(2)*(a1+2)(3)*(*(a+1)+2)(4)*(&a00+1*4+2)首元素地址表示:(1)

41、 a+1 (2) &a10(3) a1(4) *(a+1)行指針列指針int a34;a00a01a10a11a20a21a02a03a12a13a22a23元素地址表示:(1) &a12(2) a1+2(3) *(a+1)+2(4)&a00+1*4+28.4.1二維數組的地址二維數組的地址第46頁表示形式含義地址a二維數組名,數組首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值20002000201020102014

42、2312 4 615 7 9 8 23 3 2 5 178.4.1二維數組的地址二維數組的地址第47頁8.4.2 指向二維數組元素的指針變量指向二維數組元素的指針變量例例 指向二維數組元素的指針變量指向二維數組元素的指針變量main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(n);printf(%4d ,*p); int a34;a00a01a10a11a20a21a02a03a12a13a22a23pp=*a; p=&a00; p=*a0;

43、 p=a; 第48頁通過指針數組來引用二維數組元素通過指針數組來引用二維數組元素若有以下定義:int *p3,a34,i,j;表示p是一個數組名,該數組類型為指針類型,即數組的3個元素均為指針類型的數據。注意: int *p4與int (*p)4代表不同的含義。第49頁指針數組用法舉例指針數組用法舉例main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i,j, *p3; for(i=0;i3;i+) pi=ai; for(j=0;j4;j+) printf(%d ,*(pi+j); printf(n);int a34;a00a01

44、a10a11a20a21a02a03a12a13a22a23 pijp0=*a; p0=&a00; p0=a0; p0 p1 p2 * (ai+j)aij第50頁定義形式: 數據類型 (*指針名)數組大小如: int (*p)4;( )不能少int (*p)4與int *p4不同p的值是一維數組的首地址,p是行指針可讓p指向二維數組的某一行 如:int a34, (*p)4=a;一維數組指針變量維數和二維數組列數必須相同通過指向一維數組的指針變量來引用數組元素通過指向一維數組的指針變量來引用數組元素一維數組指針變量維數和二維數組列數必須相同第51頁a00a01a10a11a20a21a02a0

45、3a12a13a22a23aa+1a+2pp+1p+2p0+1或 *p+1p1+2或 *(p+1)+2*(*p+1)或 (*p)1 *(*(p+1)+2)int a34, (*p)4=a;通過指向一維數組的指針變量來引用數組元素通過指向一維數組的指針變量來引用數組元素int a34, (*p)4;p=a;第52頁main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i,j,(*p)4; for(p=a,i=0;i3;i+,p+) for(j=0;j4;j+) printf(%d ,*(*p+j); printf(n);p=a0; p

46、=*a; p=&a00; p=&a0; a00a01a10a11a20a21a02a03a12a13a22a23ppp *(*a+j) p0j通過指向一維數組的指針變量來引用數組元素通過指向一維數組的指針變量來引用數組元素第53頁表表 示示 形形 式式含義含義地地 址址a a 二維數組名,指向一維數組二維數組名,指向一維數組a0a0,即,即0 0行首地址行首地址20002000a0a0, , * *(a+0),(a+0),* *a a0 0行行0 0列元素地址列元素地址20002000a+1a+1,&a&a1 11 1行首地址行首地址20082008a1a1, ,* *(a+1)(a+1)1

47、1行行0 0列元素列元素a10a10的地址的地址20082008a1+2,a1+2,* *(a+1)+2,(a+1)+2,&a12&a121 1行行2 2列元素列元素a12 a12 的地址的地址20122012* *(a1+2),(a1+2),* *( (* *(a+1)+2),(a+1)+2),a12a121 1行行2 2列元素列元素a12a12的值的值元素值為元素值為1313第54頁定義含義int i;int *p;int an;int *pn;int (*p)n;int f();int *p();int (*p)();int *p;定義整型變量ip為指向整型數據的指針變量定義含n個元素的

48、整型數組an個指向整型數據的指針變量組成的指針數組pp為指向含n個元素的一維整型數組的指針變量f為返回整型數的函數p為返回指針的函數,該指針指向一個整型數據p為指向函數的指針變量,該函數返回整型數p為指針變量,它指向一個指向整型數據的指針變量指針的數據類型小結指針的數據類型小結第55頁 8.5 字符串的指針和指向字符串的指針變量字符串的指針和指向字符串的指針變量8.5.1字符串指針變量的定義與引用字符串指針變量的定義與引用 字符串常量的處理是用字符數組來實現的。也就是說,字符串常量的處理是用字符數組來實現的。也就是說,無論是否定義了字符數組,對于程序中出現的字符串,無論是否定義了字符數組,對于

49、程序中出現的字符串,系統都會在內存中開辟一個字符數組連續存儲空間來系統都會在內存中開辟一個字符數組連續存儲空間來存放該字符串常量。存放該字符串常量。 字符串的指針:字符串的首字符地址,也就是存放字字符串的指針:字符串的首字符地址,也就是存放字符串的字符數組的首地址。符串的字符數組的首地址。 字符串指針變量:通常把字符串指針變量:通常把char型指針變量稱為字符串型指針變量稱為字符串指針變量。也就是說,指向字符串的指針變量等同于指針變量。也就是說,指向字符串的指針變量等同于指向字符數組元素的指針變量,可以指向字符串中的指向字符數組元素的指針變量,可以指向字符串中的任意一個字符。任意一個字符。第56頁8.5.1 字符串指針變量的定義與引用字符串指針變量的定義與引用 字符串指針變量的定義和初始化字符串指針變量的定義和初始化方式一:將存放字符串的字符數組名賦給字符方式一:將存放字符串的字符數組名賦給字符串指針變量,讓字符串指針變量指向字符串的串指針變量,讓字符串指針變量指向字符串的首字符,然后通過移動指針變量來訪問字符串首字符,然后通過移動指針變量來訪問字符串的其他字符。的其他字符。 例如:例如: char str = We

溫馨提示

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

評論

0/150

提交評論