C語言程序設計 課件 (張惠濤 ) 西電 第6章 指針_第1頁
C語言程序設計 課件 (張惠濤 ) 西電 第6章 指針_第2頁
C語言程序設計 課件 (張惠濤 ) 西電 第6章 指針_第3頁
C語言程序設計 課件 (張惠濤 ) 西電 第6章 指針_第4頁
C語言程序設計 課件 (張惠濤 ) 西電 第6章 指針_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄1234指針與指針變量指針與數(shù)組指針與字符串指針與函數(shù)第6章指針5指針數(shù)組指針與指針變量6.16.1.1指針的概念地址:內(nèi)存單元的編號地址基本概念數(shù)據(jù)在內(nèi)存中的存儲定義變量-->分配內(nèi)存單元(變量名對應其地址)-->賦值例如:inta=5;charch=‘s;…20005

a200120022003…4000sch內(nèi)存地址

數(shù)據(jù)的讀寫根據(jù)變量的地址讀寫內(nèi)存單元的內(nèi)容。6.1.1指針的概念…20003變量i20046變量j20089變量k…3010……內(nèi)存例如:inti=3,j=6,k;printf(“%d%d”,i,j);scanf(“%d”,&k);

變量的訪問直接訪問:根據(jù)變量地址存取變量值間接訪問:根據(jù)指針存取變量值6.1.1指針的概念變量地址內(nèi)存單元指針變量地址內(nèi)存單元…20003變量i20046變量j20089變量k…30102000p…內(nèi)存例如:inti=3,j=6,k;printf(“%d”,i);int*p=&i;printf(“%d”,*p);

指針

(pointer)變量的地址6.1.1指針的概念例j=3;——直接訪問指針變量…...…...4000400440064005整型變量j變量j_pointer40014002400340003例*j_pointer=10;——間接訪問10指針和指針變量指向基本概念6.1.1指針的概念變量的指針:是一個變量的地址指針變量:用來存儲變量地址(指針)的變量變量的地址(指針)變量的內(nèi)存單元例如,若有inti=3;int*p=&i;則可以說p指向變量i6.1.2

指針變量的定義與使用

1.指針變量的定義一般形式:

類型名

*指針變量名;例:int*p;float*q;char*r;(1)指針變量名是p,q,r,而不是*p,*q,*r;(2)類型名是指針所指向的變量的數(shù)據(jù)類型,指針變量只能指向定義時所規(guī)定類型的變量。(3)指針變量存放的是所指向的某個變量的地址值,而普通變量保存的是該變量本身的值。注意:

例如:inti=5;floatj=2.5;int*point;point=&i;(語法正確)point=&j;(語法錯誤)6.1.2

指針變量的定義與使用

2.指針變量的使用兩個運算符:&和*&:取地址運算符,取變量的地址

一般形式為&變量名

例:int*p;//此處*表示p為指針類型

p=&a;*:指針運算符,取指針所指向的內(nèi)容

一般形式為*指針變量名

例:*p=a;6.1.2

指針變量的定義與使用注意:*和&具有相同的優(yōu)先級,結(jié)合方向是從右到左。

&*p即對*p取地址,等價于&a;

p等價于&a;*p等價于a。

3.指針變量的賦值(1)通過地址運算符&進行賦值(2)通過指針變量進行賦值

例inti;int*p=&a;int*q=p;(3)給指針變量賦空值

例int*p=NULL;

例inta=5;int*p=&a;6.1.2

指針變量的定義與使用內(nèi)存5……2010……2010a201020302050pq

1.指針變量的算術(shù)運算加減運算:一個指針可以加、減一個整數(shù)n,其結(jié)果與指針所指對象的數(shù)據(jù)類型有

關(guān)。指針變量的值(地址)增加或減少“n×sizeof(指針類型)”

6.1.3

指針變量的運算

例如,有下列定義:

int*p,a=2,b=3;假設a、b兩個變量被分配在一個連續(xù)的內(nèi)存區(qū),a的起始地址為1000。2

3…

2

3

……10002

3

…1004a(1000)b(1004)a(1000)b(1004)a(1000)b(1004)p=&ap+16.1.3

指針變量的運算(1)指針的加減運算常用于數(shù)組的處理。例如:inta[10],*p=a,*x;x=p+2;/*實際上是p加上2*4個字節(jié)賦給x,x指向數(shù)組的第三個分量*/(2)對于不同類型的指針,指針變量“加上”或“減去”一個整數(shù)n所移動的字節(jié)數(shù)是不同的。例如:floata[10],*p=a,*x;p=p+2;/*實際上是p加上2*4個字節(jié)賦給x,x依然指向數(shù)組的第三個分量*/(3)*(p++)與(*p)++含義不同,前者表示地址自增,后者表示當前所指向的變量自增。

2.指針變量的關(guān)系運算

和基本類型變量一樣,指針能進行關(guān)系運算。例如:p>q,p<q,p==q,p!=q,p>=q等。6.1.3

指針變量的運算

指針的關(guān)系運算在指向數(shù)組的指針中廣泛的運用,假設p、q是指向同一數(shù)組的兩個指針,執(zhí)行p>q的運算,其含義為,若表達式結(jié)果為真(非0值),則說明p所指元素在q所指元素之后?;蛘哒fq所指元素離數(shù)組第一個元素更近些。

指針進行關(guān)系運算之前,指針必須初始化,另外,只有同類型的指針才能進行比較。6.1.4

多級指針變量指針不但可以指向基本類型變量,亦可以指向指針變量,這種指向指針型數(shù)據(jù)的指針變量稱為指向指針的指針,或稱多級指針。二級指針的定義形式形式:

數(shù)據(jù)類型

**指針變量例如:

inta,*p,**pp;a=10;p=&a;pp=&p;2000pp(3000)1000p(2000)10a(1000)二級指針示意圖指針與數(shù)組6.26.2.1

指針與一維數(shù)組數(shù)組名是一個常量指針,它的值為該數(shù)組的首地址。指向數(shù)組的指針的定義方法與指向基本類型變量的指針的定義方法相同,例如:inta[5]={1,2,3,4,5};int*p;p=a;(把數(shù)組的首地址賦給指針變量p)6.2.1

指針與一維數(shù)組由于數(shù)組名代表數(shù)組首地址,是一個地址常量。因此,下面兩個語句等價:

p=&a[0];p=a;在定義指針變量的同時可賦初值:

inta[10],*p=&a[0];(或int*p=a;)

等價于:

int*p;p=&a[0];12345pa[0]a[1]a[2]a[3]a[4]a數(shù)組指針示意圖6.2.1

指針與一維數(shù)組*(p+i)a數(shù)組a[0]a[1]a[2]a[i]a[9]pp+1,a+1p+i,a+ip+9,a+9綜上所述,引用一個數(shù)組元素有:(1)下標法:如a[i]形式;(2)指針法:如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。

可以通過指針變量的運算來訪問數(shù)組的其他元素,如果p的初值為&a[0],則:p+i和a+i就是a[i]的地址,*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即a[i]。指向數(shù)組的指針變量也可以帶下標,如p[i]與*(p+i)、a[i]等價。6.2.1

指針與一維數(shù)組例6.4:用三種方法輸出數(shù)組全部元素。(1)下標法voidmain(){ inta[10]; inti; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) printf("%d",a[i]);}6.2.1

指針與一維數(shù)組(2)通過數(shù)組名計算數(shù)組元素地址,輸出元素的值voidmain(){ inta[10]; inti; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) printf("%d",*(a+i));}6.2.1

指針與一維數(shù)組(3)用指針變量指向數(shù)組元素voidmain(){ inta[10]; int*p,i; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(p=a;p<(a+10);p++) printf("%d",*p);}三種方法的比較:用下標法比較直觀,能直接知道是第幾個元素;而使用指針法則執(zhí)行效率更高6.2.1

指針與一維數(shù)組使用指針變量時,應注意:

(1)指針變量可實現(xiàn)使本身的值改變。

p++合法;但a++不合法(a是數(shù)組名,代表數(shù)組首地址,在程序運行中是固定不變的。)(2)要注意指針變量的當前值。voidmain(){inta[10];int*p,i;p=a;for(;p<a+10;p++)scanf("%d",p);printf("\n");for(;p<(a+10);p++)printf("%d",*p);}不能&p增加:p=a;6.2.1

指針與一維數(shù)組(3)*p++相當于*(p++),因為*與++優(yōu)先級相同,且結(jié)合方向從右向左,其作用是先獲得p指向變量的值,然后執(zhí)行p=p+1;。(4)*(p++)與*(++p)意義不同,后者是先p=p+1,再獲得p指向的變量值。若p=a,則*(p++)是先輸出a[0],再讓p指向a[1];

*(++p)是先使p指向a[1],再輸出p所指的a[1](5)(*p)++表示的是將p指向的變量值+1。

1.二維數(shù)組的地址6.2.2

指針與二維數(shù)組a[0]a[1]aa+1inta[2][3];*a*(a+1)a、a+1都是指針,它們是長度為3的整數(shù)數(shù)組a是一個長度為2的數(shù)組數(shù)組元素是長度為3的數(shù)組6.2.2

指針與二維數(shù)組對二維數(shù)組inta[2][3],有a——二維數(shù)組的首地址,即第0行的首地址a+i——第i行的首地址a[i]*(a+i)

——第i行第0列的元素地址a[i]+j*(a+i)+j

——第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同a+i

&a[i],表示第i行首地址,指向行a[i]

*(a+i)

&a[i][0],表示第i行第0列元素地址,指向列inta[2][3];a[0]a[1]100010121000100410121016a[0][0]a[0][1]a[1][1]a[0][2]a[1][2]aa+1a[1][0]6.2.2

指針與二維數(shù)組inta[2][3];二維數(shù)組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)地址表示:(1)a+1

(2)&a[1][0](3)a[1](4)*(a+1)行指針a[0][0]a[0][1]a[1][0]a[1][1]a[0][2]a[1][2]地址表示:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2列指針

2.指向二維數(shù)組的指針變量6.2.2

指針與二維數(shù)組(1)指向數(shù)組元素的指針變量。這種變量的定義與普通指針變量定義相同,其類型與元素數(shù)值類型相同。例如:int*p,a[2][3];

p=&a[1][2];(2)指向一維數(shù)組(二維數(shù)組的一行)的指針,也稱行指針。定義形式為:

類型標識符(*指針變量名)[元素個數(shù)]例如:int(*p)[3];6.2.2

指針與二維數(shù)組(1)int(*p)[3];定義一個指針變量p,p指向包含3個元素的一維數(shù)組。(2)p+i與*(p+i)的區(qū)別:

p+i是指向第i行的指針(第i行的首地址);

*(p+i)是指向第i行第1個元素的地址;

兩者數(shù)值相等,但含義不同:p+i的增值將以行長為單位,而*(p+i)增值將以元素長度為單位。

注意:指針與字符串6.3

指向字符串的指針稱字符指針 定義形式:char*指針名6.3.1字符串指針利用指針來對字符串進行操作:通過在定義時初始化指針變量使指針指向一個字符串。用指針變量實現(xiàn)對字符串的訪問。charstr[]=”student”;

字符數(shù)組名同樣是字符數(shù)組的首地址,是常量指針,表示形式同一維數(shù)組。str[0]sstrstr[1]tstr+1str[2]ustr+2str[3]dstr+3str[4]estr+4str[5]nstr+5str[6]tstr+6str[7]\0str+7

(1)通過在定義時初始化指針變量使指針指向一個字符串。字符指針示例。例6.7#include<stdio.h>voidmain(){char*ch="student";printf("%s",ch);}6.3.1字符串指針chstudent\0(2)用指針變量來實現(xiàn)對字符串的訪問。輸出字符串中n個字符后的所有字符。例6.8#include<stdio.h>voidmain(){char*ch="IloveChina!"; intn=7; ch=ch+n; printf("%s\n",ch);}6.3.1字符串指針運行結(jié)果如下:

(1)字符指針變量本身是一個變量,定義后編譯系統(tǒng)為其分配一個用于存放地址的內(nèi)存單元,具體指向的內(nèi)存單元需要通過給指針變量賦值來確定。字符數(shù)組定義后,編譯系統(tǒng)會為其分配一段連續(xù)的內(nèi)存單元,首地址由數(shù)組名表示。

(2)字符指針可以整體賦值,字符數(shù)組只能一個一個元素單獨賦值。6.3.2

字符型指針與字符數(shù)組的區(qū)別例如;char*ch=”IloveChina!”;可以寫成char*ch;ch=”IloveChina!”;//正確,ch是指針變量,字符串整體賦值可是,chara[20]=”IloveChina!”;不能寫成chara[20];a=”IloveChina!”;//錯誤,a代表首地址,只能存放一個字符,不能整體賦值指針與函數(shù)6.46.4.1

指針作為函數(shù)參數(shù)

函數(shù)形參為指針變量,實參為指針變量#include<stdio.h>voidswap(int*p,int*q){ inttemp; temp=*p; *p=*q; *q=temp;}

輸入兩個整數(shù),按從大到小的順序輸出。例6.96.4.1

指針作為函數(shù)參數(shù)運行結(jié)果如下:輸入:35↙輸出:5,3voidmain(){inta,b; int*p1,*q1;printf("請輸入兩個整數(shù):"); scanf("%d%d",&a,&b); p1=&a; q1=&b; if(a<b) swap(p1,q1);//調(diào)用swap函數(shù)printf("按大小順序輸出:"); printf("%d%d",*p1,*q1);}6.4.2

數(shù)組名作為函數(shù)參數(shù)

數(shù)組名作為函數(shù)的參數(shù),傳遞的也是地址#include<stdio.h>voidinverse(inta[],intn){ inti,j,mid=(n-1)/2,temp; for(i=0;i<=mid;i++) { j=n-1-i; temp=a[i]; a[i]=a[j]; a[j]=temp; }}將整數(shù)數(shù)組中的元素逆置。例6.10voidmain(){intb[10]={1,2,3,4,5,6,7,8,9,10}; inti; printf("輸出原數(shù)組的元素:\n"); for(i=0;i<10;i++) printf("%4d",b[i]); printf("\n"); inverse(b,10);//調(diào)用inverse函數(shù) printf("輸出數(shù)組逆置后的元素:\n"); for(i=0;i<10;i++) printf("%4d",b[i]);}運行結(jié)果如下:6.4.2

數(shù)組名作為函數(shù)參數(shù)

函數(shù)形參為指針變量,實參為變量地址#include<stdio.h>voidinverse(int*p,intn){ int*q,*i,*j,mid=(n-1)/2,temp; i=p;j=p+n-1;q=p+mid; for(;i<=q;i++,j--) { temp=*i; *i=*j; *j=temp; }}用指針變量實現(xiàn)數(shù)組元素的逆置。例6.11voidmain(){ inta[10]={1,2,3,4,5,6,7,8,9,10}; inti; printf("輸出原數(shù)組的元素:\n"); for(i=0;i<10;i++) printf("%4d",a[i]); printf("\n"); inverse(a,10);//調(diào)用函數(shù)inverse printf("輸出數(shù)組逆置后的元素:\n"); for(i=0;i<10;i++) printf("%4d",a[i]);}運行結(jié)果如下:返回指針的函數(shù)一般形式為:

數(shù)據(jù)類型*函數(shù)名(參數(shù)列表){…}例如:

int*fun(inta,intb){

函數(shù)體語句

}6.4.3

返回指針的函數(shù)函數(shù)fun要求返回值為一個int型指針,這就要求在函數(shù)體中有返回指針或地址的語句,形如:

return(&變量名);或return(指針變量);6.4.4

指向函數(shù)的指針一個函數(shù)包括一組指令序列存儲在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址。稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址??梢远x一個指針變量,其值等于該函數(shù)的入口地址,指向這個函數(shù),這樣通過這個指針變量也能調(diào)用這個函數(shù)。這種指針變量稱為指向函數(shù)的指針變量。

指向函數(shù)的指針變量的一般形式為

數(shù)據(jù)類型(*指針變量名)()

如:int(*p)();用指針調(diào)用函數(shù)的形式:(*指針變量)(實參表)指針數(shù)組6.56.5

指針數(shù)組

指針數(shù)組是指針變量的集合,即它的每一個元素都是指針變量,且都具有相同的存儲類別和指向相同的數(shù)據(jù)類型。

例如:

int*p[10];char*p[3]={“Math”,“c++”,“English”};指針數(shù)組的定義形式為:

數(shù)據(jù)類型

*數(shù)組名[數(shù)組長度];

‘M’‘a(chǎn)’‘t’‘h’‘\0’

‘c’‘+’‘+’‘\0’

‘E’‘n’‘g’‘l’‘i’‘s’‘h’

‘\0’

p[0]p[1]p[2]6.5

指針數(shù)組

(1)字符數(shù)組中每個元素可存放一個字符,而字符指針變量存放字符串首地址,而不是存放在字符指針變量中。

(2)對字符數(shù)組,與普通數(shù)組一樣,不能對數(shù)組名進行整體賦值,只能給各個元素賦值,而字符指針變量可以直接用字符串常量賦值。例如,若有如下定義:

chara[10];

char*p;

則語句a=”computer”;是非法的,因為數(shù)組名a是一個常量指針,不能對其賦值。只能對各個元素分別賦值:

a[0]=’c’;a[1]=’o’;a[2]=’m’;a[3]=’p’;……;a[7]=’r’;

但語句:p=”computer”;是合法的。

溫馨提示

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

評論

0/150

提交評論