《C語言程序設(shè)計案例教程》課件7.4指向二維數(shù)組的指針_第1頁
《C語言程序設(shè)計案例教程》課件7.4指向二維數(shù)組的指針_第2頁
《C語言程序設(shè)計案例教程》課件7.4指向二維數(shù)組的指針_第3頁
《C語言程序設(shè)計案例教程》課件7.4指向二維數(shù)組的指針_第4頁
《C語言程序設(shè)計案例教程》課件7.4指向二維數(shù)組的指針_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

指向二維數(shù)組的指針CONTENTS

目錄提出問題引入新課自主學(xué)習(xí)明確考點案例分析交流提升仿真演練體驗探索提出問題引入新課PART011、一維、二維數(shù)組的組成各包括幾個層次;2、一維數(shù)組元素的地址與值的表示方法提出問題引入新課自主學(xué)習(xí)明確考點PART021、二維數(shù)組把數(shù)據(jù)的組織分成三個層次:一是整個由行和列組成的二維數(shù)組,二是二維數(shù)組中的行,三是二維數(shù)組每行中的單個元素。三個層次之間具有由上至下包含或由下至上形成的關(guān)系:二維數(shù)組包含若干行,一行包含若干個元素;若干元素形成一行,若干行形成一個二維數(shù)組。考點一:二維數(shù)組的結(jié)構(gòu)層次與二維數(shù)組元素的地址2、二維數(shù)組元素的地址設(shè)有整型二維數(shù)組inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,11,12}};設(shè)數(shù)組a的首地址為1000,各下標(biāo)變量的首地址及其值如圖所示??键c一:二維數(shù)組的結(jié)構(gòu)層次與二維數(shù)組元素的地址1000a[0][0]01002a[0][1]11004a[0][2]21006a[0][3]31008a[1][0]41010a[1][1]51012a[1][2]61014a[1][3]71016a[2][0]81018a[2][1]91020a[2][2]111022a[2][3]12C語言允許把一個二維數(shù)組分解為多個一維數(shù)組來處理。因此數(shù)組a可分解為三個一維數(shù)組,即a[0],a[1],a[2]。每一個一維數(shù)組又含有四個元素。例如a[0]數(shù)組,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。數(shù)組及數(shù)組元素的地址表示如下:考點一:二維數(shù)組的結(jié)構(gòu)層次與二維數(shù)組元素的地址1000a[0][0]01002a[0][1]11004a[0][2]21006a[0][3]31008a[1][0]41010a[1][1]51012a[1][2]61014a[1][3]71016a[2][0]81018a[2][1]91020a[2][2]111022a[2][3]12a[0]a[1]a[2]100010081016考點一:二維數(shù)組的結(jié)構(gòu)層次與二維數(shù)組元素的地址從二維數(shù)組的角度來看,a是二維數(shù)組名,a代表整個二維數(shù)組的首地址,也是二維數(shù)組0行的首地址,等于1000。a+1代表第一行的首地址,等于1008。如圖:a[0]是第一個一維數(shù)組的數(shù)組名和首地址,因此也為1000。它表示一維數(shù)組a[0][0]號元素的首地址,也為1000。&a[0][0]是二維數(shù)組a的0行0列元素首地址,同樣是1000。因此,a,a[0],&a[0][0],*(a+0)是等同的。a1000a+11008a+21016同理,a+1是二維數(shù)組1行的首地址,等于1008。a[1]是第二個一維數(shù)組的數(shù)組名和首地址,因此也為1008。&a[1][0]是二維數(shù)組a的1行0列元素地址,也是1008。因此a+1,a[1],&a[1][0],*(a+1)是等同的。由此可得出:a+i,a[i],&a[i][0],*(a+i)是等同的??键c一:二維數(shù)組的結(jié)構(gòu)層次與二維數(shù)組元素的地址另外,a[0]也可以看成是a[0]+0,是一維數(shù)組a[0]的0號元素的首地址,而a[0]+1則是a[0]的1號元素首地址,由此可得出a[i]+j則是一維數(shù)組a[i]的j號元素首地址,它等于&a[i][j]。10000100211004210063100841010510126101471016810189102011102212aa+1a+2a[0]a[0]+1a[0]+2a[0]+33、二維數(shù)組的元素由a[i]元素可以用*(a+i)表示,則a[i]+j可表示為*(a+i)+j。由于*(a+i)+j是二維數(shù)組a的i行j列元素的首地址,所以,該元素的值就用*(*(a+i)+j)表示??键c一:二維數(shù)組的結(jié)構(gòu)層次與二維數(shù)組元素的地址二維數(shù)組多種地址的表示形式:例如:有定義inta[3][4],*p=a;表示形式含義a[i]+j,*(a+i)+j,&a[i][j],p[i]+j第i行第j列元素的地址*(a[i]+j),*(*(a+i)+j),*(&a[i][j]),*(p[i]+j)第i行第j列元素的值考點一:二維數(shù)組的結(jié)構(gòu)層次與二維數(shù)組元素的地址【例1】用指針輸出二維數(shù)組

#include<stdio.h>main(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++) printf(“%5d”,*(*(a+i)+j));printf(“\n”);}}運行結(jié)果為:1234567891011121、指向二維數(shù)組元素的指針變量定義指向二維數(shù)組元素的指針變量,定義格式<類型說明>*<指針變量名>例如:int*p;考點二:指向二維數(shù)組的指針變量賦值格式:<指針變量名>=<二維數(shù)組名>[<行下標(biāo)>];p=a[0];<指針變量名>=&<二維數(shù)組名>[<行下標(biāo)>][<列下標(biāo)>];p=&a[0][0];2、計算a[i][j]在數(shù)組中的相對位置的計算公式是:i*m+j其中m表示二維數(shù)組的列數(shù)。相對位置是指相對于數(shù)組起始位置的相對位移量(距離)。如inta[3][4],*p;p=a;則第2行第3列的元素a[2][3]相對于a[0][0]的相對位置是2*4+3=11。如果開始時指針p指向a(即a[0][0]),為了得到a[2][3]的值,就可以用*(p+2*4+3)表示。(p+11)或p[11]表示a[2][3]的地址。所以某元素a[i][j]與*(a+i*m+j)等價??键c二:指向二維數(shù)組的指針變量考點二:指向二維數(shù)組的指針變量【例2】用指針輸出二維數(shù)組的各行各列元素的值說明:利用指針的移動是以單個元素為基本單位,按照元素從上到下,行內(nèi)由左到右的順序進行移動特點。

#include<stdio.h>main(){staticintb[4][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};int*p,i,j;p=b[0];for(p=b[0];p<b[0]+20;p++)//挨個移到每個數(shù)組元素{if((p-b[0])%5==0)printf("\n");

printf("%4d",*p);}}考點二:指向二維數(shù)組的指針變量【例2】用指針輸出二維數(shù)組的各行各列元素的值方法2:根據(jù)數(shù)組元素在數(shù)組的相對位置的特點采用指針運算和下標(biāo)運算與元素的相對位置(距離或偏移量)進行。

#include<stdio.h>main(){staticintb[4][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};int*p,i,j;p=b;for(i=0;i<4;i++){for(j=0;j<5;j++)

printf("%4d",*(p+i*5+j));//采用數(shù)組元素數(shù)組中的相對位置printf("\n");}} 定義指向二維數(shù)組中某行的指針變量,需要先定義指針變量為指向一維數(shù)組(行)的指針變量,這類指針被稱為“數(shù)組指針”。一般形式為:類型說明符(*指針變量名)[長度];考點三:指向二維數(shù)組中某行的指針變量其中“類型說明符”為所指數(shù)組的數(shù)據(jù)類型?!?”表示其后的變量是指針類型?!遍L度”表示二維數(shù)組分解為多個一維數(shù)組時,一維數(shù)組的長度,也就是二維數(shù)組的列數(shù)。應(yīng)注意”(*指針變量名)”兩邊的括號不可少,如缺少括號則表示是指針數(shù)組。說明:該指針變量的特點主要表現(xiàn)在以下兩個方面:(1)指針的移動是以行為基本單位,對指針變量進行自增或自減算術(shù)運算進行移動時,將以行為單位進行跨越式移動。(2)通過指針變量對二維數(shù)組的元素進行引用發(fā)生變化,由于行指針以行作為指向?qū)ο?,結(jié)合指針運算符,有多種表現(xiàn)形式,如以a[i][j]為例:a[i]=*(a+i)得a[i]+j=*(a+i)+j。p指針指向a,則p[i]+j可表示為*(p+i)+j,其中*(a+i)+j是二維數(shù)組a的第i行第j列元素的地址,所以,該元素的值可用*(*(a+i)+j)或*(*(p+i)+j)??键c三:指向二維數(shù)組中某行的指針變量考點三:指向二維數(shù)組中某行的指針變量【例1】輸出二維數(shù)組任一行任一列元素的值。

#include<stdio.h>main(){staticintb[4][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};int(*p)[5],i,j;//定義一個數(shù)組指針p=b;//數(shù)組指針指向二維數(shù)組名scanf("i=%d,j=%d",&i,&j);printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));//采用數(shù)組指針引用元素}運行情況如下:i=2,j=2(鍵盤輸入后回車)a[2][2]=13考點三:指向二維數(shù)組中某行的指針變量【例2】輸出二維數(shù)組中的全部元素。main(){inta[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};int(*p)[4];inti,j;p=a;//數(shù)組指針指向二維數(shù)組名for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%5d",*(*(p+i)+j));printf("\n");}}運行結(jié)果為:01234567891011考點三:指向二維數(shù)組中某行的指針變量【例3】有以下程序,分析程序運行的輸出結(jié)果main()

{inta[3][2]={0},(*ptr)[2],i,j;for(i=0;i<=2;i++){ptr=a+i;scanf("%d",ptr);ptr++;}for(i=0;i<3;i++){for(j=0;j<2;j++)printf("-",a[i][j]);printf("\n");}}若運行時輸入:123<回車>,則輸出結(jié)果是()。A)產(chǎn)生錯誤信息B)10C)12D)10203020000030考點四:指向字符串的指針1、指針變量直接指向常量字符串例如:char*p;p="apple";或char*p="apple";定義指向字符串的指針變量也有兩種方式:2、指針變量指向已定義的字符數(shù)組例如:chars[]={"apple"},*p;p=s;或chars[10]={"apple"},*p=s;【例4】、輸出字符串中n個字符后的所有字符。main(){char*ps="thisisabook";intn=10;ps=ps+n;printf("%s\n",ps);}考點四:指向字符串的指針1、對字符串中的字符進行操作2、對字符串整串進行操作運行結(jié)果如下:inputastring:okokokoknum=4通過指針變量對字符串的操作方式:【例1】統(tǒng)計字符(如“k”)在某一字符串中出現(xiàn)的次數(shù)。#include<stdio.h>main(){inti,num=0;charst[20],*ps;printf("inputastring:\n");ps=st;gets(ps);for(i=0;ps[i]!='\0';i++)if(ps[i]=='k'){num++;}else{continue;}printf("num=%d\n",num);}思考:如果要求用while語句實現(xiàn),則程序如何編輯?#include"stdio.h"main(){charstr[81],substr[3],*ch;intn=0;printf("輸入主字符串");gets(str);printf("輸入子字符串");gets(substr);ch=str;while(*ch){if(*ch==substr[0]&&*(ch+1)==substr[1])n++;ch++;}printf("串%s在串%s中出現(xiàn)%d次!\n",substr,str,n);}考點三:指向二維數(shù)組中某行的指針變量【例2】、編程統(tǒng)計一個長度為2的字符串在另一個字符串中出現(xiàn)的次數(shù),例如,假定輸入字符串為:stringstudentstdiostop,子字符串為st,則應(yīng)輸出出現(xiàn)次數(shù)為4次的信息。案例分析交流提升PART03【例1】、以下程序運行后的輸出結(jié)果是()。main(){chara[]="Language",b[]="Programe";char*p1,*p2;intk;p1=a;p2=b;for(k=0;k<=7;k++)if(*(p1+k)==*(p2+k))printf("%c",*(p1+k));}【例2】、有以下程序運行后的輸出結(jié)果是()main(){chara[]="123456789",*p;inti=0;p=a;while(*p){if(i%2==0)*p='*’;p++;i++;}puts(a);}【例3】將字符串str1復(fù)制到字符串str2。#include<stdio.h>voidmain(){charstr1[]="What'syourname?",str2[20];inti;for(i=0;*(str1+i)!='\0';i++)*(str2+i)=*(str1+i);*(str2+i)='\0';/*設(shè)置字符串str2的結(jié)束標(biāo)志*/printf("Stringstr1:\t%s\n",str1);/*指針法*/printf("Stringstr2:\t");for(i=0;str2[i]!='\0';i++)/*按數(shù)組元素輸出*/printf("%c",str2[i]);/*數(shù)組下標(biāo)法*/printf("\n");}仿真演練,體驗探索PART041、寫出以下程序運行后的輸出結(jié)果是()main(){char*s[]={“one”,”two”,”three”},*p;p=s[1];printf(“%c,%s\n”,*(p+1),s[0]);}A)n,twoB)t,oneC)w,oneD)o,two2、寫出以下程序運行后的輸出結(jié)果是()main(){charstr[]=”xyz”,*p=str;while(*p)p++;for(p--;p-str>=0;

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論