《C語言程序設(shè)計(jì)》 課件 蔡玲芳 第七章 指針_第1頁
《C語言程序設(shè)計(jì)》 課件 蔡玲芳 第七章 指針_第2頁
《C語言程序設(shè)計(jì)》 課件 蔡玲芳 第七章 指針_第3頁
《C語言程序設(shè)計(jì)》 課件 蔡玲芳 第七章 指針_第4頁
《C語言程序設(shè)計(jì)》 課件 蔡玲芳 第七章 指針_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

指針與函數(shù)為指針變量賦初值取內(nèi)容運(yùn)算指針運(yùn)算取地址運(yùn)算的一般形式:&變量取地址運(yùn)算若有變量說明:inta,b,*p,

*q;scanf(“%d”,

&a);p=&a;q=p;&a10int

*p;int

a;&aint

*q;p=&a;*p=10;printf(“%d”,*p);scanf(“%d”,&a);scanf(“%d”,p);b=*p+25;讓p指向變量a把10賦給變量a輸出p所指變量的值給變量a輸入值給變量a輸入值把35賦給變量b取內(nèi)容運(yùn)算取內(nèi)容運(yùn)算的一般形式:*指針表達(dá)式若*p出現(xiàn)在賦值號左邊,表示給p所指變量賦值若*p不出現(xiàn)在賦值號左邊,表示p所指變量的值若有變量說明:inta,b,*p

;

為指針變量賦初值指針變量使用前必須有值指針變量的初值必須是地址值(不能是整數(shù))在定義指針變量時(shí)同時(shí)初始化int a,*p=

&a;使用賦值語句賦值inta,*p; p=&a;NULL是在stdio.h中定義的符號常數(shù)#defineNULL0可以為指針賦空值(NULL),此時(shí)指針不指向任何變量,如:p=NULL;

(p為空指針變量),不提倡p=0;

p=‘\0’。指針變量0012FF440012FF3C001整型變量i變量i_pointer0012FF40整型變量k…...10100012FF442FF38例 inti,k,*i_pointer;i=10;

i_pointer=&i;k=

i;k=

*i_pointer;--直接訪問--間接訪問變量的兩種賦值方式#include

<stdio.h>intmain(

){

int a,b;int *pa, *pb;a=100; b=10;pa=&a; pb=&b;printf("%d,%d\n",a,b);printf("%d,%d\n",*pa,*pb);return

0;}[例8-1]

用直接方式和間接方式輸出變量的值。給變量a,b初始化給指針變量pa,pb初始化對變量的直接訪問對變量的間接訪問[例8-2]將兩個(gè)整型數(shù)a,b按由大到小次序輸出。#include

<stdio.h>intmain(

){int

a,b,*p1=&a,*p2=&b,*p;scanf("%d%d",&a,&b);if

(a<b)if

(a<b){

p=p1;p1=p2;p2=p; }printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);return

0;}5

95,

99,

55

99,

59,

5交換p1,p2的指向#include

<stdio.h>intmain(

){inta,b,*p1=&a,*p2=&b,

p;scanf("%d%d",&a,&b);交換p1,p2所指的單元的內(nèi)容{

p=*p1;*p1=*p2;*p2=p; }printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);return

0;}感謝觀看指針數(shù)組指針數(shù)組:數(shù)組中的元素均為指針類型。適合用來指向字符串。1.定義形式數(shù)據(jù)類型

*

數(shù)組名[常量表達(dá)式]

例如:int*pa[6];[]比*優(yōu)先級高,因此pa先與[6]結(jié)合,形成pa[6],具有6個(gè)元素。然后再與*結(jié)合,表示此數(shù)組中每一個(gè)元素是指針型的。8.5指針數(shù)組2整數(shù)整數(shù)整數(shù)整數(shù)整數(shù)整數(shù)pa[0]pa[1]pa[2]pa[3]pa[4]pa[5]指針數(shù)組pa2.功能定義一個(gè)由6個(gè)指針變量構(gòu)成的指針數(shù)組,數(shù)組中的每個(gè)數(shù)組元素都是一個(gè)指向一個(gè)整數(shù)的指針變量。3.指針數(shù)組的初始化*pa[0]123a[0]*pa[1]456a[1]*pa[2]789a[2]必須用地址值為指針數(shù)組初始化inta[3][3]=

{1,2,3,4,5,6,7,8,9},*pa[3];pa[0]=a[0];pa[1]=a[1];pa[2]=a[2];指針數(shù)組pa[3]

相當(dāng)于有三個(gè)指針,*pa[0],*pa[1],*pa[2]初始化的結(jié)果:注意:int*p[5];

int(*p)[5];

不同44.指針數(shù)組的使用用指針數(shù)組和用數(shù)組地址引用數(shù)組元素是等價(jià)的*(pa[i]+j)與*(a[i]+j);*(*(pa+i)+j)與*(*(a+i)+j);(*(pa+i)[j]與(*(a+i)[j];*(&pa[0][0]+3+i+j)與*(&a[0][0]+3+i+j);*(pa[0]+3+i+j)與*(a[0]+3+i+j)

;pa[i][j]與a[i][j]

;區(qū)別:pa[i]的值可變,而a[i]的值不可變。#include

<stdio.h>#defineN

4intmain()

{inta[N][N],i,j,sum=0,*p[N]

;for(i=0;i<N;i++)p[i]=a[i];for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",p[i]+j);5[例8-12]

求N階方陣副對角線上的元素之和。for(i=0;i<N;i++)for(j=0;j<N;j++)if(i+j==N-1)sum+=p[i][j];printf("sum=%d\n",sum);return0;}1 2 3 45 6 7 89 10

11

1213 14

15

16sum=34感謝觀看指針變量與數(shù)組指針變量與數(shù)組指針與一維數(shù)組指針的運(yùn)算字符指針與字符串?dāng)?shù)組中的每個(gè)元素都可以通過下標(biāo)唯一確定,即通過下標(biāo)可以訪問(操作)數(shù)組中的元素。在C語言中,凡是可以通過數(shù)組下標(biāo)方式完成的訪問(操作)均可以通過指針方式實(shí)現(xiàn)。C語言規(guī)定:數(shù)組名就是數(shù)組的首地址常量,即int

a[10];a==

&a[0]C語言系統(tǒng)內(nèi)部處理機(jī)制,指針方式效率高,但不直觀。指針與一維數(shù)組a[6]a[0]a[1]a[2]a[3]a[4]a[5]a[9]memory訪問數(shù)組的兩種方式下標(biāo)方式inta[10],

*p;p=a;

(等價(jià)于

p=&a[0];)使p指向a數(shù)組的第一個(gè)元素a[0];a[i],*(a+i),

p[i]

,*(p+i)

等價(jià)

。指針方式通過指向數(shù)組元素的指針變量訪問所需元素。int

a[10],*p=&a[0];p++;p=&a[0]p++p++指向數(shù)組元素的指針通過指針引用數(shù)組a[7]a[8]下標(biāo)法

#include

<stdio.h>intmain(

){ inta[10],

i;for(i=0;i<10;i++)scanf("%d",

&a[i]);printf("\n");for(i=0;i<10;i++)printf("%3d",a[i]);return

0;}例:輸出數(shù)組全部元素。指針法

#include

<stdio.h>intmain(

){int

a[10],

i, *p=a;for(i=0;i<10;i++,p++)scanf(“%d”,

p);printf(“\n”);for(p=a;p<(a+10);

p++)printf(“%3d”,*p

);return

0;}*(a+i)

指針的運(yùn)算指針的算術(shù)運(yùn)算指針表達(dá)式與整數(shù)的加減運(yùn)算指針自增自減運(yùn)算指針的關(guān)系運(yùn)算同類指針相減強(qiáng)制類型轉(zhuǎn)換運(yùn)算指針表達(dá)式與整數(shù)的加減運(yùn)算一般形式p+n或 p-n其中:p是任意一個(gè)指針表達(dá)式,n是任何一種整型表達(dá)式。計(jì)算規(guī)則表達(dá)式

p+n

的值

=

p的值

+

p所指類型長度*n表達(dá)式

p-n的值

=

p的值 -

p所指類型長度*n說明:只有當(dāng)p和p+n或p-n都指向連續(xù)存放的同類型數(shù)據(jù)區(qū)域(數(shù)組)時(shí),指針加、減才有實(shí)際意義。C語言規(guī)定:表達(dá)式p+n和p-n的類型與p相同。p,ap+1,a+1p+i,a+ia[0]a[1]a[i]a數(shù)組*(p+i)例如:int

a[10],*p,*q;p=a;q=a+6;a[6]p+9,a+9a[9]q=a+6數(shù)組和指針的本質(zhì)不同:數(shù)組名是指針常量,不能改變指針常量的值,a++;a+=2;a=p;

都是非法的。指針p是變量,若p指向數(shù)組的首地址,p+1代表該類型的下一變量的地址。語法后綴:

p++

; p--

;前綴:

++p

; --p

;⑴

進(jìn)行++p或p++運(yùn)算后都使p指向下一個(gè)數(shù)據(jù)表達(dá)式p++的值等于p的原來值;表達(dá)式++p的值等于p的新值;⑵取內(nèi)容運(yùn)算符“

*

”、取地址運(yùn)算符“

&

”和自增自減運(yùn)算符都是單目運(yùn)算符,運(yùn)算的優(yōu)先級相同,結(jié)合方向都是自右至左

指針自增自減運(yùn)算......p-3p-2p-1pp+1p+2..................數(shù)組a低地址高地址當(dāng)兩個(gè)指針指向同一個(gè)數(shù)組中的元素時(shí),才能進(jìn)行>、<、>=、<=、!=、==的關(guān)系運(yùn)算。任何指針p與NULL進(jìn)行“p==NULL”或“p!=NULL”運(yùn)算均有意義:判斷指針p

是否指向空。指針的關(guān)系運(yùn)算只有同類指針進(jìn)行比較才有意義。指針的關(guān)系運(yùn)算例:inta[10],

*p;p=&a[4];a[4]

假定指針p和q指向同一個(gè)數(shù)組,則:p>

q:p>=q:p指針?biāo)冈匚挥趒所指元素之后時(shí)為1,反之為0。p指針?biāo)冈?/p>

素位于q所指元素之后(或兩指針指向同一元素)時(shí)為1,反之為0。p==q:兩指針指向同一元素時(shí)為

1,反之為0。p!=q:兩指針不指向同一元素時(shí)為

1,反之為0。語法:

指針表達(dá)式 關(guān)系運(yùn)算符 指針表達(dá)式==和!=運(yùn)算符,比較兩個(gè)指針表達(dá)式是否指向同一個(gè)內(nèi)存單元;<、<=、>、>=,比較兩個(gè)指針?biāo)竷?nèi)存區(qū)域的先后次序。.語法

:p-q說明:同類指針相減時(shí),兩個(gè)指針應(yīng)該指向連續(xù)存放的同類數(shù)據(jù)區(qū)域。p-q

的值,等于(p的值-q的值)/所指類型長度,

即p,

q兩個(gè)指針之間數(shù)據(jù)元素的個(gè)數(shù)。例如:若有

int

a[10]

,*p, *q;p=a;q=&a[5];則

p-q=5,表示p,

q之間數(shù)據(jù)元素的個(gè)數(shù)是5。同類指針相減格式:(類型名

*) 指針表達(dá)式功能:將指針表達(dá)式的值轉(zhuǎn)換成指定類型的指針。例如:int

*p;double d,

*q=&d;p=(int*

)q;強(qiáng)制類型轉(zhuǎn)換運(yùn)算[例8-3]用指針訪問數(shù)組元素。#include

<stdio.h>intmain(

){inta[10],*pa,

i;for(i=0;i<10;i++)a[i]=i+1;pa=a;for(i=0;i<10;i++,pa++)printf("%d

",*pa);printf("\n");return

0;}不要忘記賦初值字符指針與字符串字符串的表示形式用字符數(shù)組表示,如:intmain(

){ charstring[]=“Ilove

China!”;printf(“%s\n”,string);return

0;}數(shù)組名用字符指針實(shí)現(xiàn),如:intmain(

){ char*string=“IloveChina!”;printf(“%s\n”,string);return

0;}把“I

love

China!”的首地址賦給指針變量string特點(diǎn):字符串的長度不受限制;字符指針指向別處,字符串將失蹤。此字符串不能改變,只能讀取。[例8-5]使用字符指針輸出字符串。#include

<stdio.h>intmain(

){ char*p="C

Language";for(;*p!=′\0′;)putchar(*++p);return

0;}字符指針變量與字符數(shù)組的區(qū)別字符數(shù)組由若干個(gè)元素組成,每個(gè)元素中放一個(gè)字符,而字符指針變量中存放的是字符串的首地址。賦值方式:

char

str[

]=“I

am

aboy!”或:

char

str[20];gets(str);字符指針變量指向字符串首地址。賦值方法三種:char*pa=“Iama

boy!”char

*pa;pa=“Iama

boy!”如果要修改字符串的內(nèi)容,必須按如下方式處理:(3)charstr[20],

*pa=str;gets(str);

或scanf(“%s”,pa);或

scanf(“%s”,str);注意區(qū)別?感謝觀看指向數(shù)組的指針變量a[0]a[1]a[2]類型說明符

(*變量名)[正整型常量表達(dá)式];定義一個(gè)名為“變量名”的指針變量,這個(gè)指針變量所指的對象是一個(gè)有“正整型常量表達(dá)式”個(gè)元素的一維數(shù)組

(建立一個(gè)與二維數(shù)組名一樣的行指針)例如:inta[3][4],(*p)[4]=a;定義p是一個(gè)指針變量,它指向包含4個(gè)整型元素的一維數(shù)組。p,ap+1p+2指向數(shù)組的指針變量intmain(

){int

a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};int*p,i,j

;p=a[0];scanf(“d,

d”,&i,&j);printf(“a[d][d]=d\n”,i,j,*(p+i*4+j));return

0;}輸入:1,2運(yùn)行結(jié)果:a[1][2]=13這里的指針變量p是定義為指向整型數(shù)據(jù)的a[i][j]在數(shù)組中的位置用相對于數(shù)組起始位置intmain(

){ int

a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};int(*p)[4],i,j

;p=a;scanf(“d

d”,&i,&j);printf(“a[d][d]=d\n”,i,

j,*(*(p+i)+j));return

0;}輸入:1,2運(yùn)行結(jié)果:a[1][2]=13p,a第i行j列元素的地址為:*(p+i)+j第i行j列元素的值為:*(*(p+i)+j)這里的指針變量p不是指向整型p+1a[0]=1357變量,而是指向一個(gè)包含4個(gè)整p+2a[1]=9111315a[2]=17192123型元素的一維數(shù)組。感謝觀看指針與字符串?dāng)?shù)組字符串?dāng)?shù)組數(shù)組中的每個(gè)元素都是存放字符的數(shù)組。字符串?dāng)?shù)組的每一行可存放一個(gè)字符串。用賦初值的方式給字符串?dāng)?shù)組賦值⑴直接給字符串?dāng)?shù)組賦初值⑵用指針數(shù)組處理多個(gè)字符串8.6指針與字符串?dāng)?shù)組VC\0FORTRAN\0BASIC\0Foxpro\0charb[4][8]={″VC″,″FORTRAN″,″BASIC″,

″Foxpro″};二維字符數(shù)組⑴直接給字符串?dāng)?shù)組賦初值

由于字符串長短不一,定義時(shí)應(yīng)考慮最長的串和結(jié)束標(biāo)志的位置。防止造成內(nèi)存單元浪費(fèi)。若有定義:char*f[4]={″VC″,″FORTRAN″,″BASIC″,

″Foxpro″};此定義還可以寫成:char*f[]={″VC″,″FORTRAN″,″BASIC″,

″Foxpro″};則數(shù)組f中的每個(gè)元素都存放著對應(yīng)的一個(gè)字符串的首地址,各字符串依次存入各相應(yīng)的首地址開始的連續(xù)存儲單元中。f[0]f[1]f[2]f[3]VC\0FORTRAN\0BASIC\0Foxpro\0節(jié)省內(nèi)存空間?、朴弥羔様?shù)組處理多個(gè)字符串[例8-13]

用指針數(shù)組輸出多個(gè)字符串。#include

<stdio.h>intmain(

){char *s[4]={"dog","cat","pig","all

animals"};int

i;for(i=0;

i

<4; i++)printf("%s\n",

s[i]);return

0;}指針數(shù)組s各元素的值就是每個(gè)字符串的首地址。

溫馨提示

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

評論

0/150

提交評論