C語言程序設(shè)計(jì) 課件 單元7 指針_第1頁
C語言程序設(shè)計(jì) 課件 單元7 指針_第2頁
C語言程序設(shè)計(jì) 課件 單元7 指針_第3頁
C語言程序設(shè)計(jì) 課件 單元7 指針_第4頁
C語言程序設(shè)計(jì) 課件 單元7 指針_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

單元七

指針導(dǎo)學(xué)【問題】

定義一個整型變量a,如何知道分配給變量a的存儲空間的地址編碼是多少?如何通過指針對變量a進(jìn)行操作?2指針變量的應(yīng)用目錄1如何定義指針變量7.1.1內(nèi)存地址與指針(1)內(nèi)存地址

在計(jì)算機(jī)中,內(nèi)存空間的最小單位為字節(jié),操作系統(tǒng)會為每個字節(jié)的內(nèi)存空間進(jìn)行編號,這個編號就是內(nèi)存地址。變量存儲空間的第一個字節(jié)對應(yīng)的內(nèi)存地址可看作是存儲地址。

內(nèi)存空間10001001內(nèi)存地址inta;//占用4個字節(jié)charc;//占用1個字節(jié)1002100310047.1.1內(nèi)存地址與指針(2)指針與指針變量

根據(jù)存儲地址可以訪問相應(yīng)的存儲單元,所以通常也把地址稱為指針。C語言允許定義一個變量來存放指針,這種變量就稱為指針變量。1000P110001001內(nèi)存地址10021003指針變量

內(nèi)存空間charc;//占用1個字節(jié)inta;//占用4個字節(jié)1001P210047.1.2指針變量的定義與初始化(1)指針變量的定義定義指針變量的一般格式:

類型名

*變量名;類型名:表示該指針變量只能保存該類型變量的指針。*:表示該變量是指針變量,只能保存地址數(shù)據(jù)。變量名:表示指針變量的名稱,變量名的命名需遵循標(biāo)識符命名規(guī)則。int*p1;//p1是指向整型數(shù)據(jù)的指針變量char*p2;//p2是指向字符型數(shù)據(jù)的指針變量7.1.2指針變量的定義與初始化(2)指針變量的初始化第一種:定義指針變量的同時進(jìn)行初始

第二種:先定義指針變量,然后再進(jìn)行初始

int*p=NULL;//指針初始化為空inta=5;//定義整型變量aint*p;//定義指針變量p

p=&a;//p指向變量aint*p=&a;等價于7.1.3指針變量的引用指針變量的運(yùn)算符有兩個:“*”和“&”?!?”是指針運(yùn)算符,也稱為間接引用操作符,它返回指針指向的變量的值?!?”是取地址運(yùn)算符,它返回運(yùn)算對象的內(nèi)存地址。inta=5,b,*p;p=&a;//指針變量p指向a的地址b=*p;//將p所指向變量a的值賦給b注:定義指針變量和引用指針變量都有符號“*”,但含義不同,前者是指針類型的

表示符,表示p是一個指針變量,后者表示指針變量所指向的變量。7.1.3指針變量的引用#include<stdio.h>intmain(){

inta=5;

//定義整型變量a,并進(jìn)行初始化

int*p1,*p2;//定義兩個指針變量p1、p2

p1=&a;//對p1進(jìn)行初始,p1指向變量a

p2=p1;

//將指針變量p1的值賦給p2,p2指向變量a

printf("*p1=%d\n*p2=%d",*p1,*p2);

return0;}【例7-1】對指針變量的操作運(yùn)行結(jié)果:7.1.3指針變量的引用#include<stdio.h>intmain(){

inta=5;

int*p1,*p2;

p1=&a;

p2=p1;

printf("*p1=%d\n*p2=%d\n",*p1,*p2);

scanf("%d",p1);//輸入10

printf("*p1=%d\n*p2=%d\n",*p1,*p2);

return0;}【例7-2】對指針變量指向的變量的操作運(yùn)行結(jié)果:7.1.3指針變量的引用#include<stdio.h>voidswap(int*p1,int*p2)//自定義函數(shù)swap{

inttemp;

temp=*p1;

*p1=*p2;

*p2=temp;}intmain(){

inta=5,b=10;

printf("a=%db=%d\n",a,b);

swap(&a,&b);//調(diào)用自定義函數(shù)

printf("a=%db=%d\n",a,b);

return0;}【例7-3】利用自定義函數(shù)交換兩個變量的值運(yùn)行結(jié)果:7.1.3指針變量的引用#include<stdio.h>voidswap(inta,intb){

inttemp;

temp=a;

a=b;

b=temp;}intmain(){

inta=5,b=10;

printf("a=%db=%d\n",a,b);

swap(a,b);

printf("a=%db=%d\n",a,b);

return0;}【思考】以下以下程序是否可以完成兩個變量值的交換運(yùn)行結(jié)果:1如何定義指針變量目錄2指針變量的應(yīng)用7.2.1一維數(shù)組與指針(1)建立指針與數(shù)組的關(guān)系p=a;inta[5];int*p;//建立數(shù)組a與指針p之間的關(guān)系等價于p=&a[0];如何建立數(shù)組a與指針p之間的關(guān)系?p

p+1

a+1p+2

a+2p+3

a+3p+4

a+4a[1]a[0]a[2]a[3]a[4]

數(shù)組a[5]a內(nèi)存單元7.2.1一維數(shù)組與指針(2)指針運(yùn)算數(shù)組名a表示數(shù)組的初始地址,p指向數(shù)組的第一個元素a[0],p+1指向下一個數(shù)組元素a[1]。p+1、p-1并不是數(shù)學(xué)中計(jì)算,而是表示移動一個“單元”,對于int類型來講,p和p+1相差4個字節(jié),若數(shù)組的初始地址為1000,那么p+1的值為1004。地址間關(guān)系:&a[0]<==>a<==>p;&a[i]<==>a+i<==>p+i;元素間關(guān)系:a[0]<==>*a<==>*p;a[i]<==>*(a+i)<==>*(p+i);p

p+1

a+1p+2

a+2p+3

a+3p+4

a+4a[1]a[0]a[2]a[3]a[4]

數(shù)組a[5]a內(nèi)存單元7.2.1一維數(shù)組與指針(3)利用指針變量訪問數(shù)組#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};inti;

int*p;

p=a;

for(i=0;i<=4;i++)

{

printf("元素a[%d]的地址:%p,值為:%d\n",i,p+i,*(p+i));

}

return0;}【例7-5】利用指針變量p訪問數(shù)組a7.2.1一維數(shù)組與指針#include<stdio.h>voidmax(int*p,intn){

inti,max=*p;

for(i=0;i<n;i++)

{

if(max<*(p+i))

max=*(p+i);

}

printf("最大值為%d",max);}intmain(){

inta[5]={1,2,3,4,5};max(a,5);

return0;}【例7-6】利用指針變量p尋找數(shù)組a中的最大值7.2.2二維數(shù)組與指針(1)二維數(shù)組中所蘊(yùn)含的地址關(guān)系inta[3][3]={1,2,3,4,5,6,7,8,9};二維數(shù)組a由3個元素組成:a[0]、a[1]、a[2]a[0]包含有

3

個元素:a[0][0]、a[0][1]、a[0][2]a[0]a[1]a[2]123456789a7.2.2二維數(shù)組與指針(1)二維數(shù)組中所蘊(yùn)含的地址關(guān)系a代表二維數(shù)組的首地址,也是二維數(shù)組第0行的首地址。a+1代表第1行的首地址。aa+1a+210001個整型變量占4個字節(jié),一行12占用個字節(jié)10121024a[0]a[1]a[2]1234567897.2.2二維數(shù)組與指針(1)二維數(shù)組中所蘊(yùn)含的地址關(guān)系a[0]代表二維數(shù)組第0行的首地址,a[i]代表第i行的首地址。a[0]也代表第0行第0個元素地址,a[0]+i代表第0行的第i個元素地址。123456789a[0]1000a[0]+1a[0]+2a[1]a[2]7.2.2二維數(shù)組與指針(1)二維數(shù)組中所蘊(yùn)含的地址關(guān)系二維數(shù)組元素a[i][j]的地址以及值的表示歸納總結(jié)為:地址表示方法:&a[i][j]<==>a[i]+j<==>*(a+i)+j值表示方法:a[i][j]<==>*(a[i]+j)<==>*(*(a+i)+j)7.2.2二維數(shù)組與指針(2)指針在二維數(shù)組中的應(yīng)用---指針數(shù)組定義:數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組定義的一般格式:int*p[n];

注意:[]優(yōu)先級高,先與p結(jié)合成為一個數(shù)組,再由int*說明這是一個整型指針數(shù)組,它有n個指針類型的數(shù)組元素,為p[0]、p[1]、p[2]...p[n-1],而且它們都是指針變量,用來存放變量地址。7.2.2二維數(shù)組與指針【例7-7】利用指針數(shù)組遍歷二維數(shù)組a[3][3]={1,2,3,4,5,6,7,8,9}#include<stdio.h>intmain(){

inta[3][3]={1,2,3,4,5,6,7,8,9};int*p[3];//定義一個指針數(shù)組inti,j;

for(i=0;i<3;i++)

p[i]=a[i];

//數(shù)組指針賦初值,為二維數(shù)組每行地址

for(i=0;i<3;i++){

for(j=0;j<3;j++)

printf("%d",*(p[i]+j));

printf("\n");}

return0;}運(yùn)行結(jié)果:(2)指針在二維數(shù)組中的應(yīng)用---行指針定義:行指針也稱為數(shù)組指針,指的是數(shù)組名的指針,即數(shù)組首元素地址的指針。行指針定義的一般格式:int(*p)[n];()優(yōu)先級高,首先說明p是一個指針,指向一個整型的一維數(shù)組,這個一維數(shù)組的長度是n,可以說是p的步長。當(dāng)執(zhí)行p+1時,p要跨過n個整型數(shù)據(jù)的長度。7.2.2二維數(shù)組與指針7.2.2二維數(shù)組與指針【例7-7】利用行指針遍歷二維數(shù)組a[3][3]={1,2,3,4,5,6,7,8,9}#include<stdio.h>intmain(){

inta[3][3]={1,2,3,4,5,6,7,8,9};

int(*p)[3];//定義一個行指針p,指向一個二維數(shù)組,[3]表示指針指向的行包含的元素個數(shù)

inti,j;p=a;

for(i=0;i<3;i++){

for(j=0;j<3;j++)

printf("%d",*(*(p+i)+j));

printf("\n");}

return0;}運(yùn)行結(jié)果:7.2.3字符串與指針“helloworld!"

由雙引號括起來的字符序列

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論