版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第3章指針本章主要內(nèi)容指針概念指針的運算指針與數(shù)組指針變量作為函數(shù)參數(shù)返回指針值的函數(shù)(指針函數(shù))指向函數(shù)的指針main函數(shù)的參數(shù)指向指針的指針帶著疑問學習這個指針的類型是什么?指針所指的數(shù)據(jù)類型是什么?該指針指向了哪里(指針的值、指針指向的內(nèi)存區(qū))?指針本身所占據(jù)的內(nèi)存區(qū)3.1指針概念1、內(nèi)存與地址
☆內(nèi)存中的每個位置由一個獨一無二的地址標識
☆內(nèi)存中的每個位置都包含一個值
☆地址與內(nèi)容(eg.)0x000000000x000000010x000000100x00000011……0xFFFFFFFC0xFFFFFFFD0xFFFFFFFE0xFFFFFFFF2、值與類型(eg.)3、變量的指針和指針變量
變量的指針就是變量的地址,指針變量的值就是該指針變量所指變量的內(nèi)存首地址
*p就表示指針變量p所指向的變量(取值)指針概念4、間接訪問指針概念112-13.14100108
inta=112,b=-1; floatc=3.14; int*d=&a;//int*d;d=&a; float*e=&c;//int*e;e=&c;100104108112116abcde可以通過*d,*e來操作a與c變量5、指針變量的定義[存儲類型]數(shù)據(jù)類型*指針變量名[=初始值];
eg:inti,j;
int*p1,*p2; p1=&i; p2=&j;
畫圖說明指針概念說明:指針變量所指向的類型可以是整、實、字符型等。
指針變量只能指向同一類型的變量。
指針變量是p1、p2,而不是*p1、*p2。*p1和*p2是p1和p2所指向的變量i和j。
指針變量中只能存放地址。
p1=100;*p1=&i;非法指針概念6、未初始化和非法指針
eg:int*a;*a=12;
question1:指針a指向哪里?
question2:萬一a存放的是合法地址呢?7、NULL指針指針概念8、指針、間接訪問和左值
eg:inta; int*d=&a; *d=10-*d;
d=10-*d;9、指針、間接訪問和變量
eg:*&a=25; *100=25;
*(int*)100=25;//指針常量指針概念10、指針變量的引用 運算符:取地址--&
取內(nèi)容--*(地址運算符)
(1)指針變量p的內(nèi)容為地址量;*p為指針p的目標量,內(nèi)容為數(shù)據(jù),即指針變量p所指向的變量的值。 (2)*p=i;是將變量i的值賦給目標變量*p
(3)p=&i;是將變量i的地址賦給指針變量p。 (4)&p為指針變量p的地址。 (5)&(*p)的結(jié)果為p,即變量*p的地址。 (6)*(&i)的結(jié)果就是i本身。指針概念右圖中:P==2000*p==3&p==3010&(*p)==2000*(&i)==3指針概念例3.1main(){ inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;/
將變量a和b的地址賦給指針變量p1和p2/printf(“%d,%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);/*p1和*p2就是變量a和b/}運行結(jié)果:100,10100,10指針概念注意:本題中a和b并未交換,而p1和p2的值改變。例3.2
main()
{int*p1,*p2,*p,a,b;
scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a<b){p=p1;p1=p2;p2=p;}
printf(“a=%d,b=%d\n”,a,b);printf(“max=%d,min=%d\n”,*p1,*p2);
}運行情況:
5,9
a=5,b=9
max=9,min=5指針概念3.2指針的運算3.2.1指針的算術運算
++/--+/-
分析*p++與(*p)++3.2.2指針的關系運算
==/!=3.3指針與數(shù)組1、指向一維數(shù)組的指針例:inta[10],*p;p=&a[0];//將a[0]元素的地址賦給指針 //變量p
在C中,數(shù)組名代表數(shù)組的首地址。因此,p=a;p=&a[0];注:p=a;//將a數(shù)組的首地址賦給指針變量p //這里的a并不代表整個數(shù)組。
通過指針引用數(shù)組元素
p
=
a
;/*將整型數(shù)組a的首地址賦給指針變量
p*/
*p=5;/*將5賦給a數(shù)組的第一個元素a[0],等價于
a[0]=5*/
p+1表示:指針變量p當前所指的數(shù)組元素的下一個元素,不是p的值加
1
。若有p=&a[0],則
p+i
(或a+i)就是
a[i]
的地址(因為a代表數(shù)組a的首地址)。若有p=&a[0],則*(p+i)或*(a+i)就是p+i或a+i所指向的數(shù)組元素,即a[i]。即:*(p+i)=*(a+i)=a[i]。
指向數(shù)組的指針變量可以帶下標,如:
p[i]
*(p+i)指向一維數(shù)組的指針也可寫成如下:main(){inta[10],*p=a
,i
;for(
i=0;i<10;i++)scanf(“%d”,p++);printf(“\n”);
p=a;/
此語句必不可少
/for(
i=0;i<10;i++,p++)printf(“%d”,*p);}例3.3輸出有10個元素的整型數(shù)組a的元素值。main(){inta[10],*p,i
;for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“\n”);for(p=a;p<(a+10);p++)printf(“%d”,*p);}指向一維數(shù)組的指針
如果p指向數(shù)組a
(即p=a),則:p++(或p+=1)表示p指向下一個元素;*p表示取得當前所指元素之值。*p++
*(p++)a[i++]
表示先求*p,再p+1p(*p--類似)*(++p)a[++i],表示p+1p,再求*p。(*p)++a[i]+1。
注意指向數(shù)組的指針變量的當前值,因為指針可以指向數(shù)組最后一個元素以后的內(nèi)存單元。指向一維數(shù)組的指針
staticinta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};說明:
行地址
a
:代表整個二維數(shù)組的首地址,也是第0行的首地 址,值為&a[0][0]。
a+2:代表第2行的首地址,值為&a[2][0]
列地址
a[0]
*(a+0)&a[0][0]:代表0行0列的首地址
a[1]
*(a+1)&a[1][0]:代表1行0列的首地址
a[0]+1
*(a+0)+1&a[0][1]a[1]+2
*(a+1)+2&a[1][2]。
*(a+1)+2不能寫成*(a+1+2),否則就變成*(a+3),即a[3]。2、指向多維數(shù)組的指針因為a[0]+1
*(a+0)+1&a[0][1]
所以*(a[0]+1)
*(*(a+0)+1)a[0][1]
同理,*(*(a+0)+1)
*(*a+1)a[0][1],*(a[
i
]+j)
*(*(a+i)+j)a[
i
][j]一維數(shù)組a[i]:代表第i+1個元素所占的內(nèi)存單元。二維數(shù)組a[i]:代表一維數(shù)組名,a[i]本身不占用內(nèi)存單元,只是一個地址務必記?。?(a+i)a[i]地址:a、a+i、a[
i
]、*(a+i)、*(a+i)+j、a[
i
]+j值:*(a[
i
]+j)
*(*(a+i)+j)a[
i
][j]。staticinta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}在一維數(shù)組中:a+i指第i個數(shù)組元素的存儲單元;在二維數(shù)組中:a+i=a[i]=*(a+i)=&a[i]=&a[i][0],都表示i行0列元素的地址值。在二維數(shù)組中&a[i]并不是a[i]單元的物理地址,但能得到i行的首地址。例3.4輸出二維數(shù)組中的任一元素。main(){
staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4],i,j;p=a;scanf(“i=%d,j=%d”,&i,&j
);printf(“a[%d,%d]=%d\n”,i,j,*(*(p+i)+j));}運行情況:i=1,j=2/*
注意這里的輸入格式*/a[1,2]=13程序中的“int(*p)[4]”表示
p
是一個指向包含4個元素的一維數(shù)組的指針變量,即p是一個行指針,指向一維數(shù)組的首地址。由于運算符優(yōu)先級的關系,這里的(*p)[4]不能寫成*p[4]。一、字符串的表示形式
用字符數(shù)組實現(xiàn)
staticcharstr[]=“IloveChina!”;str[i]表示字符數(shù)組中的第i+1個字符。如:str[8]為字符‘h’
用字符指針實現(xiàn)
char*a=“IloveChina!”;
盡管沒有定義為字符數(shù)組,但實際在內(nèi)存開辟了一個字符數(shù)組用來存放字符串常量。同樣,a[8]為字符‘h’。注意:
a不是字符串變量,此處將“IloveChina!”的首地址賦給指針變量a。3、字符串的指針二、字符串指針作函數(shù)參數(shù)
可以用地址傳遞的方式,即用字符數(shù)組名作參數(shù)或用指向字符串的指針變量作參數(shù),將一個字符串從一個函數(shù)傳遞到另一個函數(shù)。例3.5用函數(shù)調(diào)用實現(xiàn)字符串的復制。
用字符數(shù)組作參數(shù)voidcopy_string(charfrom[],charto[]){inti=0;while(from[i]!=‘\0’){to[i]=from[i];i++;}to[i]=‘\0’;}main(){chara[]=“Iamateacher.”;charb[]=“youarestudents.”;copy_string(a,b);printf(“string_a=%s\nstring_b=%s\n”,a,b);}運行結(jié)果:string_a=Iamateacher.string_b=Iamateacher.
形參用字符指針變量voidcopy_string(char*from,char*to){for(;*from!=‘\0’;from++;to++)
*to=*from;
*to=‘\0’;}main(){
char*a=“Iamateacher.”;char*b=“youarestudents.”;copy_string(a,b);printf(“string_a=%s\nstring_b=%s\n”,a,b);}說明:字符數(shù)組:由若干個元素組成,每個元素可存放1
個字符。字符指針變量:存放的是字符串的首地址,絕不是將字符串存放到字符指針變量中。
字符數(shù)組:賦初值最好要用static存儲類別如:
staticstr[]={“IloveChina!”};
字符指針變量:賦初值不必加static,如:
char*a=“IloveChina!”;
這是因為它只是對指針變量初始化,而不是對數(shù)組初始化。字符數(shù)組:只能對各個元素賦值,下列方式錯誤
charstr[15];str=“IloveChina!”;三、字符指針變量與字符數(shù)組
對字符指針變量賦初值時:char*a=“IloveChina!”;等價于:
char*a; a=“IloveChina!”;即數(shù)組可以在變量定義時整體賦初值,但不能在賦值語句中整體賦值。注意:對數(shù)組初始化時:
staticcharstr[14]={“IloveChina!”};不等價于:
charstr[14]; str[]=“IloveChina!”;字符指針變量:可采用char*a;a=“IloveChina!”;這里賦給a的是字符串的首地址,而不是字符串。
charstr[14]; scanf(“%s”,str);是可以的。但如果寫成如下形式:
char*a; scanf(“%s”,a);
是非常危險的。因為指針變量沒有確定的地址而指向程序區(qū)或其它數(shù)據(jù)區(qū),從而會造成系統(tǒng)“沖突”。應寫成如下形式:
char*a,str[10]; a=str; scanf(“%s”,a);
數(shù)組在編譯時被分配內(nèi)存單元,有確定的地址。而指針變量必須賦給一個確定的地址值,否則,在程序運行時會發(fā)生意想不到的后果。如:
main() {
char*a=“IloveChina!”; a=a+7; printf(“%s”,a); }運行結(jié)果如下:
China!下面的寫法是錯誤的:
charstr[]={“IloveChina!”}; str=str+7; printf(“%s”,str);
若定義一個指針變量使它指向一個字符串后,可以用下標形式引用指針變量所指字符串中的字符。
指針變量的地址值可以改變,而數(shù)組名的地址值不能改變。如:例3.6main(){
char*a=“IloveChina.”;inti=5;printf(“%c\n”,a[i]);for(i=7;a[i]!=‘\0’;i++)printf(“%c”,a[i]);}運行結(jié)果如下:eChina.
可用指針變量指向一個格式字符串來代替printf函數(shù)中的格式字符串。也可以在定義字符數(shù)組賦初值時賦予一個格式字符串代替printf函數(shù)中的格式字符串。如:
char*format; format=“a=%d,b=%f\n”; printf(format,a,b);它相當于:
printf(“a=%d,b=%f\n”,a,b);例3.7順讀和倒讀都一樣的字符串稱為“回文”,如:LEVEL。試編寫一個判斷輸入的字符串是否為回文的程序。#include“stdio.h”#include“string.h”main(){
chars[81],*pi,*pj;inti,j,n;gets(s);n=strlen(s);pi=s;pj=s+n-1;/pi和pj分別指向字符串首末/while(*pi==‘’)pi++;/
跳過輸入時的前導空格/while(*pj==‘’)pj--;/
跳過輸入時的尾隨空格/while((pi<pj)&&(*pi==*pj)) {pi++;pj--;}if(
pi<pj)printf(“NO\n”);elseprintf(“YES\n”);}4、指針數(shù)組char**p
;inti;for(i=0;i<5;i++){p=name+i;printf(“%s\n”,*p);}}定義形式:類型標識符*數(shù)組名[數(shù)組長度]例如:int*p[4];
定義了有4個元素的指針數(shù)組,每個數(shù)組元素都指向一個整型變量。例8.8
main()
{staticchar*name[]={“Followme”,“BASIC”,“GreatWall”, “FORTRAN”,“Computerdesign”};指向指針的指針作用:將一個變量的地址傳送至另一個函數(shù)中
例3.93.4指針變量作為函數(shù)參數(shù)用指針變量作參數(shù)調(diào)用函數(shù)能獲得多個值。此例中a和b的值交換,而s1和s2的值不變。3.5返回指針值的函數(shù)(指針函數(shù))定義形式:類型標識符*函數(shù)名(參數(shù)表)
例如:int*fa(x,y);注意:指針函數(shù)VS指向函數(shù)的指針變量例:int*a(x,y);int(*a)();a為整型指針函數(shù)a為指向函數(shù)的指針變量3.6指向函數(shù)的指針一、用函數(shù)指針變量調(diào)用函數(shù)例3.10求兩數(shù)中的較大者。
main(){
intmax();int(*p)();/
定義p是指向函數(shù)的指針變量/inta,b,c;p=max;scanf(“%d,%d”,&a,&b);c=(*p)(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);}max(x,y)intx,y;{
intz;if(x>y)z=x;elsez=y;return(z);}函數(shù)的參數(shù)可以是:變量指向變量的指針變量數(shù)組名指向數(shù)組的指針變量函數(shù)指針變量函數(shù)指針變量作用:將函數(shù)名傳遞給形參,實現(xiàn)函數(shù)地址的傳遞。
二、用函數(shù)指針變量作函數(shù)參數(shù)3.7main函數(shù)的參數(shù)形式:main(intargc,char*argv[],char*env[])參數(shù)含義如下:argc
表示命令行的參數(shù)個數(shù)。a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024工程招標合同范本
- 2024年度云服務租賃合同
- 公司春節(jié)晚會活動策劃3篇
- 2024年度智能家居安防監(jiān)控系統(tǒng)安裝與維護合同
- 2024年商業(yè)物業(yè)管理合同
- 2024雙方關于環(huán)保設備的買賣合同
- 2024年廢物分類與回收協(xié)議
- 2024年度CFG樁基工程項目管理合同
- 2024年度產(chǎn)品質(zhì)量保證與維修服務合同
- 2024年夫妻雙方關于房產(chǎn)買賣及產(chǎn)權分配協(xié)議
- 2024版人教版英語初一上單詞默寫單
- 化學實驗室安全智慧樹知到期末考試答案2024年
- 經(jīng)典房地產(chǎn)營銷策劃培訓(全)
- 工人入場安全教育課件
- 【川教版】《生命 生態(tài) 安全》二年級上冊第12課 少點兒馬虎 多點兒收獲 課件
- 人教版數(shù)學四年級上冊第五單元 《平行四邊形和梯形》 大單元作業(yè)設計
- 靜配中心差錯預防
- 送教上門體育、健康教案教學內(nèi)容
- 高夫品牌市場分析報告
- 職業(yè)規(guī)劃書-數(shù)字化設計與制造技術
- 國家臨床重點??平ㄔO項目申報書
評論
0/150
提交評論