版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第8章 指 針,指針是C 語言中的一個重要概念,是C 語言的 精華、靈魂。,1. 內存單元地址 程序中定義了變量后,在編譯時系統(tǒng)就給這個變量分配內存單元。內存中每一個內存單元都有一個編號,這就是“地址”。 內存單元地址 就是編譯后系統(tǒng)分配給變量的內存空間位置。 例如: int i , j, k;,8.1 地址和指針的概念, 數據在內存中的存取方式:直接訪問方式 和 間接訪問方式。 直接訪問方式:按變量地址存取變量值。 間接訪問方式: 把一個變量的地址放在另一個變量中。, 內存單元的內容 內存單元中存放的數值。 例如:i=3 ;j=6 ; 在2000單元中存放數值 3,3 即為內容。 在2002
2、單元中存放數值 6,6 即為內容。,例: printf(%d, i ) ; 其執(zhí)行是這樣的:根據變量名與地址的對應關系,找到變量i 的地址2000,然后從由2000開始的兩個字節(jié)中取出數據(即變量的值3),把它輸出。 這種按變量地址存取變量值的方式稱為“直接訪問”方式。,例如,我們定義一個變量 i_pointer ,用來存放整型變量i 的地址: i_pointer = /* 把變量 i 的地址賦給變量 i_pointer */ 這時i_pointer的值 就是變量 i 所占用的內存單元的起始地址(2000)。 如何存取變量i 的值?,間接訪問方式: 通過存儲在某一個內存單元中的地址去存取該地址
3、所指向的內存單元中的變量值。,要存取變量i 的值,先要找到存放i 的地址的變量(i_pointer),從中取出i 的地址(2000),然后到2000、2001字節(jié)中取出i 的值(3)。,表示將數值3送到變量中,有兩種方法: 將3 送到變量i 所標志的單元中。 將3 送到變量i_pointer 所“指向”的單元中。 所謂“指向”就是通過地址來體現(xiàn)的。 (如右圖所示),由于通過地址可以找到所需的變量單元,因此可以說,地址“指向”該內存單元。在C 語言中,將地址形象化地稱為“指針”。 一個變量的地址稱為該變量的“指針”。例如地址2000是變量i的指針。 如果有一個變量,專門用來存放另一個變量的地址(
4、即指針),則它稱為“指針變量 ”。如前面所說的i_pointer變量稱為指針變量。指針變量的值是指針(地址)。 注意:(1) “指針” 和 “指針變量” 這兩個不同的概念。 (2) 通過指針變量如何訪問變量 i 的值? (間接訪問),變量的指針就是變量的地址。存放變量地址的變量是指針變量,用來指向另一個變量。 指針變量和它所指向的變量之間,用“ * ” 表示“ 指向”。 例如 i_pointer代表指針變量,* i_pointer 是i_pointer所指向的變量。,8.2 變量的指針和指向變量的指針變量,可以看到,* i_pointer也代表一個變量,它和變量i 是同一回事。下面兩個語句作用
5、相同: i=3; * i_pointer=3; 第個語句的含義是將3 賦給指針變量i_pointer所指向的變量。,8.2.1 定義一個指針變量,指針變量是專門用來存放地址的,因此必須定義為“ 指針類型”。 指針變量定義的一般形式: 基類型 * 指針變量名 指針變量的基類型 用來指定該指針變量可以指向的變量的類型。 例如: int *pointer_1,*pointer_2 ;(指向整型變量的指針變量) float *pointer_3;(指向實型變量的指針變量) char *pointer_4;(指向字符型變量的指針變量),注意: 1. 指針變量前面的“ * ” 表示該變量是指針變量。 指針
6、變量名是 pointer_1、pointer_2 ,而不是*pointer_1、*pointer_2 . 2. 在定義指針變量時必須指定基類型。 不同類型的數據在內存中所占的字節(jié)數是不同的。 指針變量的類型說明 是為了告訴系統(tǒng)按變量中的地址從內存選取幾個字節(jié)的數據進行操作,便于 指針的移動和指針的運算操作。 3. 一個指針變量只能 指向同一類型的變量,即存放同一類型變量的地址。,怎樣使一個指針變量指向另一個變量呢? 可以使用賦值語句。 例如: float x ; char ch ; float * pointer_3 ; char * pointer_4 ; pointer_3 = ,例: i
7、nt k, i=5; int *pointer; pointer=,輸出變量 i 的值5,k的值為5,8.2.2 指針變量的引用,指針變量中只能存放地址(指針),不能將一個整型量或任何其它非地址類型的數據賦給一個指針變量。 例如賦值語句:pointer_1=2000; (不合法),有關地址的運算符: 1. int *pointer_1 ,*pointer_2; /*定義指針變量,指向整型變量*/ a=100; b=10; pointer_1= ,例8.1 通過指針變量訪問整型變量。,運行結果: 100,10 100,10,pointer_1 指向a,*pointer_1 就是變量a 。 poi
8、nter_2 指向b, *pointer_2就是變量b 。, scanf(%d,%d, ,例8.2 輸入整數a和b,按先大后小的順序輸出a和b 。,運行結果: a=5 , b=9 max=9 , min=5,實際上并沒有交換a 和b。算法不交換整型變量的值(變量a和 b中的值沒有改變),而是交換兩個指針變量的值(即變量a和 b的地址),使p1指向大的數,p2指向小的數。,8.2.3 指針變量作為函數參數,例:對輸入的兩個整數按大小順序輸出。,#include void main() void swap(int *,int *); int ,; int *pointer_,*pointer_;
9、scanf(,); pointer_ ; pointer_2 ; if() swap( pointer_ , pointer_2 ); printf(,); ,void swap(int *,int *) int temp; temp*1; *; *temp; ,例:對輸入的三個整數按大小順序輸出。,#include void main() int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d, ,void exchange(int *q1,int *q2,int *q3) if(*q1*q2)s); if(*q1*q3)s); if(*q2*q3)s); ,void s
10、 *pt1,int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; ,一個變量有地址,一個數組包含若干元素,每個元素在內存中占用存儲單元,它們也應該有相應的地址。一個變量既然可以指向變量,當然也可以指向數組和數組元素。 所謂數組的指針是指 數組的起始地址。數組元素的指針是數組元素的地址 。 例如:int a10 , i , *p, *p1; p= a; 或 p=,8.3 數組的指針和指向數組的指針變量,引用數組元素可以用下標法(如a3),也可以用指針法,即通過指向數組元素的指針找到所需的元素。使用指針法能使目標程序質量高(占用內存少,運行速度快
11、)。,8.3.1 指向數組元素的指針,例如: int a10; int *p; . p=,指向數組元素的指針變量,其定義與普通指針變量的定義相同。,把元素a0 的地址賦給 p, 即p指向 數組a 的第0個元素。 因為數組名表示數組的首地址,所以它 等價于 p=a ; 應注意數組a 并不代表整個數組,而是把數組a 的首地址賦給指針變量p,不是把數組a 的各個元素賦給p。,假設已經定義了數組和一個指針變量 int a10; int *p=a; . *p=1;,數組元素的引用可以用 1. 下標法: ai 2. 指針法: *(a+i) 或 *(p+i) 其中p 為指向數組a 的指針變量,初值 p=a;
12、 下標法比較直觀,程序容易閱讀,指針表示,8.3.2 通過指針引用數組元素,對p 當前所指的元素 賦整數值1,注意: C規(guī)定 :p+1 (或p+) 指向同一數組的下一個元素 (不是地址值簡單加1)。p+1代表的實際地址是 p+1d(d是一個數組元素所占的字節(jié)數)。 當 p 的初值為 a 的首地址時, p+i 或 a+i 就是ai 的地址,因為 a 代表了數組的首地址。 *(p+i) 或*(a+i) 所指的數組元素就是ai 的內容。 實際上, 是變址運算符,對ai 的處理,是將ai 按a+i 計算地址,然后找出此地址單元中的值。 指向數組的指針變量也可以帶下標, 如: pi 等價于*(p+i)
13、,即ai 。,例8.5 輸出數組中全部元素 :四種方法。,main( ) int a10=1,2,3,4,5,6,7,8,9,10; int *p, i ; printf(n下標法:n) ; for(i=0 ; i10 ; i+) printf(%d, ai) ; printf(n指針法(數組名):n); for(i=0 ; i10 ; i+) printf(%d, *(a+i) ; printf(n指針法(指針變量):n) ; p=a; for(i=0 ; i10 ; i+) printf(%d, *(p+i) ; printf(n指針法(指針變量):n) ; for(p=a ; pa+10
14、 ; p+) printf(%d ,*p) ; printf(n) ; ,否!a+的操作是非法的,因 a是常量。,能否改成如下形式? for(p=a;ap+10; a+) printf(%d,*a),幾種方法的比較: 下標法和指針法(數組名)執(zhí)行效果是相同的。編譯系統(tǒng)先將ai 轉換為*(a+i),即先計算元素地址,因此這兩種方法找數組元素比較費時。 指針變量法是直接指向數組元素,p+的自加操作比較快。 用下標法比較直觀。,例 8.6 通過指針變量輸入輸出數組 a 的10個元素 main( ) int *p , i , a10 ; p=a ; for(i=0 ; i10 ; i+ ) scanf
15、(%d, ,如果輸出時沒有語句 p=a; 程序將 ?,P是地址,不要加 則:,一、 多維數組的地址 例. 二維數組 int a34=1,3,5,7,9,11,13,15,17,19,21,23; 分析二維數組的性質: a 是一個數組名,包含3個元素: a0,a1,a2。 每個元素又是一個一維數組,包含4個元素。,8.3.4 指向多維數組的指針和指針變量, 從二維數組的角度看,a 代表整個二維數組的首地址,也就是第0行的首地址。 若a 的首地址為2000,因為每一行4個元素,占用8個字節(jié),所以則 a+1的首地址為2008,a+2的首地址為2016。 故a+1 代表第1行的首地址,即a1的地址;a
16、+2 代表第2行的首地址,即a2的地址。, 由于a0 與 *(a+0) 等價,a1 與 *(a+1) 等價,ai 與 *(a+i) 等價,因此ai+j 與*(a+i)+j 等價,它們都是元素aij 的地址。 故:元素aij 的地址表示是: ai+j 或 *(a+i)+j 而 *(*(a+i)+j) 或 *(ai+j) 是元素 aij的值。, a0、a1、a2既然是一維數組名,則它們應代表一維數組的首地址。 a0代表第0行一維數組中第0列元素的地址,即 printf(FORMAT, a , *a) ;1 printf(FORMAT, a0 , *(a+0) ;2 printf(FORMAT, 8
17、 ,(假設系統(tǒng)給數組 a 分配的首地址為 2000) 則運行結果是:,注意: a 是二維數組名,代表數組首地址,不能企圖用*a來得到a00的值。 *a 相當于*(a+0) ,即a0,它是第0行地址。 a是行指針,*a是列指針,指向0行0列元素。*a是0行0列元素的值。 a+1指向第一行首地址,不能企圖用*(a+1)得到a10的值,而應該用*(a+1) 求a10元素的值。,2000, 2000 2000, 2000 2000, 2000 2008, 2008 2008, 2008 2016, 2016 2016, 2016 9, 9,例 8.12 用指針變量輸出數組元素的值。 main( ) i
18、nt a34=1,3,5,7,9,11,13,15,17,19,21,23 ; int *p ; for(p=a0 ; pa0+12 ; p+) printf(%4d , *p) ; ,運行結果: 1 3 5 7 9 11 13 15 17 19 21 23,p-a0:為相距的單元個數,不是字節(jié)數 若: a0 2000 p 2008 則: p-a0 = 4,1. 指向數組元素的指針變量,二、指向多維數組的指針變量,if(p-a0)%4 = = 0) printf(n) ;,數組元素在數組中的位置: 計算某個指定的數組元素在數組中的位置(即相對于數組起始位置的相對位移量): 設a是大小為 nm
19、的二維數組,則 元素 aij 在數組中的相對位置的計算公式為: i*m+j 若 p 是一個指針變量,指向二維數組 a 的首地址: p=,若定義: int a34; p= /*p指向 a0*/ 則p+1 不是指向a01,而是a1,p的增值以一維數組的長度為單位。故aij可表示為:*(*(p+i)+j)。,例 8.13 輸出二維數組任一行任一列元素的值。,main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23 ; int (*p)4 , i , j ; p=a ; scanf(%d,%d , ,運行結果: 輸入: 1, 2 輸出: a12=13,說明: aij
20、 的地址可以表示為: *(p+i) + j 。注意*(p+i) + j 不能寫成 p+ i+j。 對于數組指針p, p=a; 則p 指向二維數組 a 的第一行首地址 。 對于指針變量 p,p=a0;則 p 指向二維數組 a 的第一行第一列元素首地址, 而 p=a ; 是不合法 的。,void average(float *p, int n) float *p_end; float sum=0 , aver; p_end=p+n-1; for( ; p=p_end; p+ ) sum=sum + (*p); aver=sum/n; printf(average=%6.2n,aver); void
21、 search( float (*p)4 , int n) int j ; printf(the score of No. %d are:n, n); for (j=0 ; j4 ; j+) printf(%5.2f , *(*(p+n)+j) ); ,由于 p 指向一維數組,因此,*(p+n) 是第 n 行的首地址, *(p+n)+j 是 第 n 行第 j 列元素的地址。,運行結果: average=82.25 the score of No.2 are: 90.00 99.00 100.00 98.00,最后一個元素的地址,從指向第一個元素起, 依次指向下一個元素,例 8.15 在上例中,
22、找出有一門以上不及袼的學生,輸出其全部成績。,void search( float (*p)4 , int n) int i , j , flag; for(j=0 ; jn ; j+) flag=0 ; for (i=0 ; i4 ; i+) if(*(*(p+j)+i)60) flag=1 ; if(flag= = 1) printf(No. %d fails , his scores are :n , j+1); for(i=0 ; i4 ; i+) printf(%5.1f , *(*(p+j)+i) ); ,程序運行結果: No.1 fails,his scores are: 65.
23、0 57.0 70.0 60.0 No.2 fails,his scores are : 58.0 87.0 90.0 81.0,8. 4. 1 字符串表示形式 在C程序中,可以用兩種方法訪問一個字符串。 1. 用字符數組存放一個字符串 例 8.16,main( ) char string = I love China! ; printf(%sn , string) ; 運行結果: I love China!,8.4 字符串的指針和指向字符串的指針變量,字符串常量按字符數組處理,在內存中開辟了一個字符數組來存放字符串常量,這里 string 是數組名,代表這個字符數組的首地址。 stringi
24、就是 *(string+i) 。,2. 用字符指針指向一個字符串 例 8.17 main( ) char *string = I love China! ; printf(%sn , string) ; ,注意: 不能認為string是一個字符串變量,以為是在定義時把“I love China!” 賦給該字符串變量。 通過字符數組名或字符指針變量可以輸出一個字符串( %s 的格式),但是不能企圖用數組名輸出它的全部元素(%d 只能輸出一個元素值)。 由于可以用數組或指針來表示字符串,因此對字符串中字符的存取可以用下標法,也可以用指針法。,等價于: char *string; string=I
25、love China!; 定義一個指向字符數據的指針,把該字符串的首地址賦給 string,定義一個指針變量 string ,指向字符串的首地址。,例 8.18 復制字符串 a 到字符串 b。用下標方法:,main( ) char a =I am a boy.; char b20; int i; for(i=0 ; *(a+i)!=0 ; i+) *(b+i)=*(a+i); *(b+i)=0; /* 復制0 */ printf(string a is :%sn,a); printf(string b is :); for(i=0 ; bi!=0 ; i+) printf(%c,bi); pr
26、intf(n); ,運行結果: string a is :I am a boy. string b is :I am a boy.,字符指針作函數參數,用函數調用實現(xiàn)字符串的復制,(1) 用字符數組作參數,#include void main() void copy_string(char from , char to ); char a = am a teacher; char =you are a student; printf(“string a= string ,); printf(“copy string a to string b:n ”); copy_string (,); pr
27、intf(nstring a=%snstring b=%sn,a,b); ,void copy_string(char from , char to ) int ; while(from!) tofrom; to; ,(2) 形參用字符指針變量,#include void main() void copy_string(char * from, char *); char * am a teacher .; char *you are a student ; printf(string a=string ,); printf(copy string a to string b:n ); _(,
28、); printf(nstring a=%snstring b=%sn,a,b); ,void copy_string(char *r,char *) for(;*from!;from,to) *tofrom; *to; ,(3) 對copy string 函數還可作簡化,將copy_string函數改寫為 void copy_string (char *from,char *) while(*from)?。?to;from; , copy_string函數的函數體還可改為 while(*to*from)?。?; ,copy_string函數的函數體還可寫成 while(*from?。?*to*
29、from; *to; ,上面的while語句還可以進一步簡化為下面的while語句: while(*to*from); 它與下面語句等價: while(*to*from)?。?; 將*from賦給*to,如果賦值后的*to值等于則循環(huán)終止(已賦給*to),函數體中while語句也可以改用for語句: for(;(*to*from)??;); 或 for(;*to*from;);,也可用指針變量,函數copy_string可寫為 void copy_string (char from ,char ) char*,*; from; while(*p2*p1)!); ,2. 初始化與賦值方式。 字符指針
30、變量可以在定義時初始化,也可以用賦值語句賦值。 如,char *a =I love China! ; 與char *a ; a=I love China! ; 等價。,8.4.3 字符指針變量與字符數組的討論,將字符串的首地址 賦給該指針變量。,兩者都能用于字符串的存儲和運算,但是兩者是有區(qū)別的: 字符數組由若干元素組成,每個元素中存放一個字符;字符指針變量中存放的是字符串的首地址,決不是將字符串放到字符指針變量中。,3. 數組一經定義,就有了確定的內存單元。 字符指針變量定義后,雖然也分配了內存單元,在沒有對指針變量賦初值之前,這個單元中沒有一個確定的地址值,因此該指針并未具體指向某個字符數
31、據。,4. 數組名代表該數組的起始地址,它的值不能改變;指針變量的值可以改變 例8.21,main( ) char str =I love China! ; str=str+7 ; printf(%s , str) ; ,main( ) char *a=I love China! ; int j ; printf(The sixth character is %cn , a5) ; for(j=0 ; aj!= 0 ; j+) printf(%c , aj) ; ,運行結果: The sixth character is e I love China!,若定義了一個指針變量,并使它指向一個字符
32、串,就可用下標形式引用指針變量所指的字符串中的字符。 例 8.22,*(a+j),運行結果:China!,不合法,5. 可以用指針變量指向一個格式字符串,用于代替printf 函數中的格式字符串。 例如:,char *format ; format=a=%d,b=%fn ; printf(format , a , b) ;,char format =a=%d,b=%fn ; printf(format , a , b) ;,它相當于 printf(a=%d,b=%fn , a , b) ; 因此,只要改變指針變量format 所指向的字符串,就可以改變輸入輸出的格式。這種printf 函數稱為
33、可變格式輸出函數。 也可以用字符數組實現(xiàn)。如,由于不能用賦值語句對數組整體賦值,所以使用指針變量的方式較方便。,指向函數的指針變量定義的一般形式: 數據類型標識符 (*指針變量名) ( ) ;,例如: int (*p)( );,p 所指向的函數的返回值的類型 (即函數值的類型),(*p) 表示 p 先與 * 結合,即說明 p 是指針變量,然后再與后面的 ( ) 結合,表示指針 p 指向函數。,c= max(a , b);,注意: 1. 這里 (*p)( ) 只表示定義了一個存放函數入口地址的指針變量,在把某個函數的地址賦給它之前,并不指向哪個函數,在程序中把某個函數的地址賦給它后才指向這個函數
34、,因此,一個函數指針變量可以先后指向不同的函數。 2. 函數指針變量賦初值:只需給出函數名而不必給出參數 如: p=max; 3. 用指針變量調用函數時,只用 (*p) 代替函數名即可。 如: c=(*p) (a , b) ; 4. 指向函數的指針變量的算術運算沒有意義,例如:p+ , p+n , p- -,這里 *p 外面的 ( ) 不能省,int max(x,y) int x,y; return(xy?x:y); ,調用 p 所指向的函數,8.7.1 指針數組 指針數組 數組元素均為指針類型數據, 即每個元素都是指針變量。 指針數組的定義形式: 類型標識 *數組名 數組長度 例如: int
35、 *p4,例如: 若干個字符串的排序和查找。 由于字符串本身就是一個字符數組,而各個字符串的長度又不同,因此用二維數組處理不太方便。 如果用指針數組,使各元素分別指向各個字符串,那么只要改變指針數組中各元素的指向,就可對所指的字符串進行排序。,注意與 int (*p)4 的區(qū)別!,8.7 指針數組和指向指針的指針,由于 的優(yōu)先級高于* , p 先與 結合表示數組,然后 p 再與 * 結合,表示數組是指針類型,int 表示每個數組元素指向一個整型變量.,例如:有若干字符串,長短不一,可以分別定義一些字符串,然后用指針數組中的元素分別指向各字符串。如果想對字符串排序,不必改動字符串的位置,只需改動
36、指針數組中各元素的指向。這樣,各字符串的長度可以不同,且移動指針要比移動字符串所花的時間少得多。,void print(char *name , int n) int i; for(i=0 ; in ; i+) printf(%sn, namei) ; ,#include main( ) void sort(char *name , int n ); void print(char *name , int n); char *name =Follow me, BASIC, Great Wall, FORTRAN, Computer design; int n=5; /* 字符串個數 */ so
37、rt(name , n) ; print(name ,n) ; ,void sort(char *name , int n) char *temp; int i , j , k ; for(i=0 ; i0) k=j; if (k != i) temp=namei; namei=namek; namek=temp; ,例8.27 將n 個字符串按字母順序(由小到大)排序輸出( 設 n=5 ),運行結果: BASIC Computer design FORTRAN Follow me Great Wall,定義形式: 類型標識 * 變量名 例如: char *p,由于*是從右到左結合,因此 *p
38、 相當于 *(*p),8.7.2 指向指針的指針,例如: char *name5; char *p ; p=name +2; printf(%on, *p) ; printf(%sn , *p) ;,例8.28 使用指向指針的指針,main( ) char *name =Follow me, BASIC, Great Wall, FORTRAN, Computer design ; char *p ; int j ; p=name ; for(j=0 ; j5 ; j+) printf(%sn , *(p+j) ; ,以%o 輸出name2的值(地址),以%s 輸出name2的字符串Great
39、 Wall,運行結果: Follow me BASIC FORTRAN Great Wall Computer design,main( ) int a5=1,3,5,7,9 ; int *num5= ,例 8.29,運行結果: 13579,8.8.1 指針類型的小結,8.8 指針類型和指針運算的小結,指針運算有如下幾種: 1. 指針變量 可以和整數進行加(減),例如: p+ , p- - , p+i , p-i , p+=i , p-=i ; 注意:p+ 1 指的是加 1 個單位,即 p 所指向的變量占用的內存字節(jié)數,如 p是指向 整型變量的指針,則加 2個字節(jié)。 2. 指針變量可以賦值(賦
40、地址),例如: p= ( NULL 表示整數 0 ),在 stdio.h 中有定義:#define NULL 0 任何指針變量或地址都可以與NULL作相等或不相等的比較,如 if(p=NULL) 4. 兩個指針變量可以相減,即 p2 - p1 ,表示兩個指針之間的元素個數。 但p1+p2 無意義。 5. 若兩個指針指向同一個數組的元素,則可以進行比較, 例如: p1p2 , p1=p2 .,8.8.2 指針運算小結,它可以用來表示指向一個抽象的數據類型。例如: char *p1 ; void *p2 ; p1=(char *) p2 ; 把 p2 強制轉換為指向字符變量的指針。 也可以將一個函
41、數定義為 (void *)類型,例如: void *fun(char ch1 , char ch2),指針是C語言中重要的概念。使用指針的優(yōu)點是: (1) 提高效率 ; (2) 被調函數可以改變主調函數的值,即可以返回多個值; (3) 可以實現(xiàn)動態(tài)存儲分配。,8.8.3 void 指針類型,指針變量如何定義,指針和地址的關系,如何對指針進行運算? 如何定義和使用以下對象:指針數組、數組指針、指針的指針、函數指針、返回值為指針的函數。 如何使用字符指針? 如何通過指針來改變函數實在參數的值? 什么是命令行參數?如何正確使用?,本 章 要 點,習 題 八 (一),(一)填空 (1) 寫出建立圖一所
42、示的存儲結構所需的定義語句: char_. (2) 寫出圖一所示的存儲結構所需的賦值語句: _=B ; p=_. (3) 寫出用指針變量 p 輸出字符變量的語句: printf(%cn ,); (二)填空 (1) 寫出建立圖二所示的存儲結構所需的定義語句: int _ , _ ; (2) 寫出圖二所示的存儲結構所需的賦值語句: p=_ ; (3) 寫出用指針變量 p 輸出數組 s 每一個元素值的語句: for(j=0 ; j6 ; j+) printf(%dt , _) ; (4) 要使 p指向數組的最后一個元素 ,改變 p的表達式是。,(三)填空 (1) 寫出建立圖三所示的存儲結構所需的定義
43、語句: float _ , _ , _ ; (2) 寫出圖三所示的存儲結構所需的賦值語句: k =_ ; s =_ ; p=_ ; (3) 用指針變量 s 輸出 k 的值語句: ; (4) 用指針變量 p 輸出 k 的值的語句: ;,(四)寫出以下程序運行結果。,(1) #include main( ) int a , *ap ; a=100 ; ap= ,(4) main( ) int c =1,7,12 , *p ; p=c ; printf(%d , *+p) ; (5) #include main( ) char *ap , *s ; int j , n ; s=Happy New Y
44、ear ; ap=s ; for(n=0 ; *s ! = 0 ; +s , +n) ; for(j=0 ; jn ; +j) putchar(*ap+) ; ,習 題 八(二),(一 ) 寫出以下程序運行結果,(1) #include main( int argc , char *argv ) printf(%d %s , argc , argv1+1) ; 若執(zhí)行命令為 test hello worl d (2) #include main( ) int a=10 , b=80 ; int *p1= ,(3) int x =1 , 2 ; int y =4 , 5 , 6 ; int z
45、=7 , 8 , 9 ; int *a =x , y , z ; main( ) int *t ; printf(%dt , *a0) ; t=a0+1 ; printf(%dt , *t) ; t=a1 ; printf(%dt , *t) ; printf(%dt , *(t+1) ; printf(%dn , *(a+2) ; ,(4) main( ) char *p ; int m ; p=abcdef ghijk! ; m=len (p) ; printf(length of = %dn , p , m) ; len (char *ptr) int j ; for(j=0 ;* pt
46、r+ != 0 ; j+) ; return( j ) ; ,例1. 查12個月英文單詞。,main( ) int n ; char *month_name( ) ; scanf(%d , ,3、 int a10 ; void input( ) int j ; for(j=0 ; j=max) max=*(a+j) ; n=j ; if(m0) temp=*(a+0) ; *(a+0)=*(a+m) ; *(a+m)=temp ; if(n9) temp=*(a+9) ; *(a+9)=*(a+n) ; *(a+n)=temp ; ,void print( ) int j ; for(j=0
47、; j10 ; j+) printf(%4d , *(a+j) ; main( ) input( ) ; change( ) ; print( ) ; ,指針習題解答,6、 #include main( ) int len(char *ptr) ; char s80 , *p ; int m ; gets(s) ; p=s ; m=len(p) ; printf(%d , m) ; int len(char *ptr) int n ; for( n=0 ; *ptr!=0 ; ptr+) n+ ; return( n ) ; ,7、 #include #include main( ) void copystr(char *p1 , char *p2 , int n) ; int m ; char str180 , str280 ; printf(Input a string:n) ; gets(str2) ; printf(Input m:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度純凈水綠色包裝研發(fā)與應用合同4篇
- 個性化信息咨詢服務合作合同樣本版
- 2025版建筑材料電子商務平臺會員服務合同樣本2篇
- 2025年度程序員入職及技能培訓合同范本4篇
- 潤滑油批量采購合同范文
- 2025經濟合同的涉稅分析及涉稅處理
- 2025挖機租賃合同協(xié)議
- 學校建設工程施工合同
- 2025企業(yè)形象識別系統(tǒng)(CIS)建設設計合同
- 2025版木屋建筑工程施工許可證辦理合同樣本3篇
- 中醫(yī)診療方案腎病科
- 2025年安慶港華燃氣限公司招聘工作人員14人高頻重點提升(共500題)附帶答案詳解
- 人教版(2025新版)七年級下冊數學第七章 相交線與平行線 單元測試卷(含答案)
- GB/T 44351-2024退化林修復技術規(guī)程
- 從跨文化交際的角度解析中西方酒文化(合集5篇)xiexiebang.com
- 中藥飲片培訓課件
- 醫(yī)院護理培訓課件:《早產兒姿勢管理與擺位》
- 《論文的寫作技巧》課件
- 空氣自動站儀器運營維護項目操作說明以及簡單故障處理
- 2022年12月Python-一級等級考試真題(附答案-解析)
- T-CHSA 020-2023 上頜骨缺損手術功能修復重建的專家共識
評論
0/150
提交評論