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

下載本文檔

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

文檔簡(jiǎn)介

級(jí)高語言設(shè)計(jì)程2009.8朱立華俞瓊王立柱1序章節(jié)自測(cè)及在線編程練習(xí):http://主講人:朱立華2009.8朱立華俞瓊王立柱2第五章一級(jí)指針與一維數(shù)組2009.8朱立華俞瓊王立柱32009.8朱立華俞瓊王立柱4內(nèi)容提要一維數(shù)組專用于一批類型相同的變量的處理指針類型與指針的基類型直接引用與間接引用的不同方式及實(shí)質(zhì)指針是地址的類型,是對(duì)地址進(jìn)行的一種類型抽象,用來實(shí)現(xiàn)間接訪問,掌握以下指針的知識(shí)內(nèi)容提要指針的基本操作指針與一維數(shù)組的關(guān)系一維數(shù)組的定義及初始化,一維數(shù)組的基類型訪問一維數(shù)組元素的方式——間接引用方式一維數(shù)組中的常見操作及算法:輸入、輸出、逆置、查找、插入、刪除、排序利用指針進(jìn)行間接訪問指針與變量的關(guān)系指針與一維數(shù)組的關(guān)系動(dòng)態(tài)演示動(dòng)態(tài)演示2009.8朱立華俞瓊王立柱5重點(diǎn)難點(diǎn)提示重點(diǎn)難點(diǎn)提示常用算法檢索檢索檢索動(dòng)態(tài)演示動(dòng)態(tài)演示動(dòng)態(tài)演示間接引用的必要性內(nèi)容回顧:intm;表示定義一個(gè)變量,m是變量名,即變量空間名,直接用m訪問的是變量空間中的內(nèi)容,稱為直接引用一個(gè)算法問題:輸入10000個(gè)整數(shù)并求平均值,并且保留這些原始數(shù)據(jù)到最后統(tǒng)一輸出解決方案:將這10000個(gè)整數(shù)看作邏輯上前后相鄰的并且可以存儲(chǔ)在內(nèi)存中一片連續(xù)的區(qū)域,只要知道這些數(shù)在內(nèi)存中的起始地址,就能找到對(duì)應(yīng)的空間,進(jìn)而訪問空間中的內(nèi)容,這就是間接引用方式,因此:要有變量可以存放地址--指針;要有類型可以定義一個(gè)標(biāo)識(shí)符代表一組連續(xù)空間的起始地址--一維數(shù)組2009.8朱立華俞瓊王立柱6用第4章的循環(huán)可以求解,定義1個(gè)變量,在循環(huán)體中讀入值并求和用1個(gè)變量不能達(dá)到這一要求,根據(jù)前面的知識(shí),似乎應(yīng)該定義10000個(gè)變量,可是這樣又無法用循環(huán)控制間接引用方式下,傳遞某一個(gè)數(shù)據(jù)地址(一般是第1個(gè)數(shù)據(jù)的地址)相當(dāng)于傳遞了全部數(shù)據(jù)

一級(jí)指針類型(引言)

C語言優(yōu)越于其他高級(jí)語言的一個(gè)特性就是:可對(duì)硬件編程;通過第一章機(jī)器語言程序設(shè)計(jì)的學(xué)習(xí),在計(jì)算機(jī)內(nèi)部訪問操作數(shù)首先是讀取其在內(nèi)存中的存儲(chǔ)地址值,然后通過該地址值去訪問該地址所在空間中的內(nèi)容C語言為了實(shí)現(xiàn)對(duì)硬件編程,必定要將內(nèi)存地址抽象為一種類型,這就是(一級(jí))指針類型,即指針類型是地址的類型,該類型的常量和變量值都是內(nèi)存地址值。地址值是無符號(hào)整數(shù),無論該地址的內(nèi)存中數(shù)據(jù)是什么類型,地址值都占4個(gè)字節(jié)顯然,知道地址值是為了操作這個(gè)地址中所存儲(chǔ)的內(nèi)容。通過地址來訪問數(shù)據(jù)空間的方式稱為間接引用通過該地址去間接引用的數(shù)據(jù)類型稱為地址的基類型前面學(xué)習(xí)的通過存儲(chǔ)空間的名稱引用數(shù)據(jù)的方式稱為直接引用2009.8朱立華俞瓊王立柱7這兩種類型有區(qū)別也有聯(lián)系一級(jí)指針類型(概述)直接引用與間接引用:在C語言源程序中的直接引用方式經(jīng)編譯后在計(jì)算機(jī)內(nèi)部實(shí)質(zhì)上是間接引用,例如源程序中有下列代碼:intn,m; //定義2個(gè)整型變量,n和m是變量名doublex; //定義1個(gè)雙浮點(diǎn)型變量,x是變量名表n=5; //直接引用,給n賦值5m=n; //直接引用,將n中的值賦給mx=3.1415; //直接引用,給x賦值3.1415

經(jīng)編譯后,變量名消失,留下其地址及類型信息,如下表:變量名變量值地址類型x3.14150x12ff70doublem50x12ff78intn50x12ff7cint2009.8朱立華俞瓊王立柱8源程序中目標(biāo)程序中地址的基類型到哪里訪問數(shù)據(jù)指示編譯器怎樣操作特定地址上的內(nèi)存區(qū)域:該區(qū)域包含多少連續(xù)的字節(jié),數(shù)據(jù)存儲(chǔ)的格式,以及可以實(shí)施哪些基本操作

一級(jí)指針類型(概述)C語言中,用一級(jí)指針類型作為地址的類型。地址關(guān)聯(lián)著兩個(gè)存儲(chǔ)空間,存放著兩種不同的值,彼此又有緊密的聯(lián)系,以上頁表中地址0x12ff78為例如下:(int*)0x12ff78m0x12ff7852009.8朱立華俞瓊王立柱9整型變量m的空間,此為變量空間編譯后指向m的地址值,是指針常量值因此,一級(jí)指針類型是復(fù)合類型,由指針的基類型名稱加”*”共同組成,例:int*----->整型指針類型,即指針?biāo)赶虻目臻g存int值double*----->雙浮點(diǎn)型指針類型指針字面值常量,即指針常量空間的名稱一級(jí)指針類型(用*間接引用)利用指針去訪問它指向的基類型的空間分兩步:(1)通過指針字面值常量取出基類型空間的地址,這是直接引用

(2)加間接引用運(yùn)算符“*”,得到與基類型空間名稱等價(jià)的表達(dá)式,稱為間接引用表達(dá)式,這是間接引用(int*)0x12ff78m0x12ff7852009.8朱立華俞瓊王立柱10因此,*(int*)0x12ff78與m完全等價(jià),m=5;也可以寫成:*(int*)0x12ff78=5;上機(jī)在VC++下演示程序5.1總結(jié):間接引用運(yùn)算符*使得指針可以訪問其基類型空間動(dòng)態(tài)演示過程一級(jí)指針類型(基本操作)指針的基本操作——加減一個(gè)整數(shù)(1)指針加一個(gè)整數(shù)i,是將當(dāng)前地址值加上i*sizeof(基類型)(2)指針減一個(gè)整數(shù)i,是將當(dāng)前地址值減去i*sizeof(基類型)指針字面值常量地址值基類型值(int*)0x12ff000x12ff005(int*)0x12ff040x12ff046(int*)0x12ff080x12ff087(int*)0x12ff0c0x12ff0c8(int*)0x12ff100x12ff1092009.8朱立華俞瓊王立柱11總結(jié):理論上,指針可以加減任何整數(shù),但必須保證結(jié)果指針指向應(yīng)用程序的數(shù)據(jù)空間,否則不能間接訪問(int*)0x12ff00+2=(int*)0x12ff08

(int*)0x12ff10-3=(int*)0x12ff04

sizeof(int)=4(int*)0x12ff10+2=(int*)0x12ff18,地址0x12ff18所指向的空間不是本程序的數(shù)據(jù)空間,無意義!動(dòng)態(tài)演示過程一級(jí)指針類型(基本操作)指針的其它基本操作:(1)指針可以進(jìn)行邏輯運(yùn)算,例:!(int*)0x12ff00的結(jié)果為0(2)指針可以進(jìn)行關(guān)系運(yùn)算,例:(int*)0x12ff00<(int*)0x12ff08的結(jié)果為1(真)(3)兩個(gè)類型相同的指針(即基類型相同的指針)可以相減,地址大的減地址小的,結(jié)果為兩個(gè)地址間區(qū)域所含基類型數(shù)據(jù)個(gè)數(shù)。指針字面值常量地址值基類型值(int*)0x12ff000x12ff005(int*)0x12ff040x12ff046(int*)0x12ff080x12ff087(int*)0x12ff0c0x12ff0c8(int*)0x12ff100x12ff1092009.8朱立華俞瓊王立柱12(int*)0x12ff0c-(int*)0x12ff04=2

一維數(shù)組類型(概述)將物理上前后相鄰、類型相同的一組變量作為一個(gè)整體引入C語言,這個(gè)整體稱為(一維)數(shù)組類型的變量,簡(jiǎn)稱(一維)數(shù)組,其中每一個(gè)變量稱為數(shù)組元素,變量的個(gè)數(shù)稱為數(shù)組長(zhǎng)度或數(shù)組容量。引入數(shù)組的目的:利用間接引用方式,訪問一組數(shù)據(jù)。具體地說,從第一個(gè)數(shù)組元素的地址,計(jì)算出其他所有數(shù)組元素的地址,然后通過數(shù)組元素的地址,間接訪問數(shù)組元素。定義一個(gè)數(shù)組:需要:(1)指定數(shù)組名,這個(gè)名稱代表著第一個(gè)數(shù)組元素的指針,是一個(gè)指針常量,等價(jià)于一個(gè)指針字面值常量,稱為數(shù)組指針(2)指定數(shù)組元素的類型,它是數(shù)組指針的基類型,是間接引用方式的基礎(chǔ)(3)指定數(shù)組長(zhǎng)度,即數(shù)組包含的元素個(gè)數(shù),它決定了數(shù)組指針在進(jìn)行加減整數(shù)的算術(shù)運(yùn)算時(shí)的有效范圍2009.8朱立華俞瓊王立柱13一維數(shù)組類型(數(shù)組定義)數(shù)組的定義格式為:

類型標(biāo)識(shí)符一維數(shù)組名[整型常量表達(dá)式];例:inta[5];元素地址元素值元素名1元素名2a?*aa[0]a+1?*(a+1)a[1]a+2?*(a+2)a[2]a+3?*(a+3)a[3]a+4?*(a+4)a[4]2009.8朱立華俞瓊王立柱14類型標(biāo)識(shí)符是數(shù)組元素的類型(也稱為數(shù)組的基類型)的標(biāo)識(shí)是1個(gè)合法的用戶自定義標(biāo)識(shí)符,代表整個(gè)數(shù)組空間的起始地址(第1個(gè)元素的地址),是1個(gè)指針常量表示數(shù)組的長(zhǎng)度,即數(shù)組元素的個(gè)數(shù),必須用一個(gè)常量表達(dá)式而不能用變量間接引用表達(dá)式下標(biāo)(索引)表達(dá)式注意:數(shù)組元素的下標(biāo)從0開始,可以是整型常量或變量,需要保證范圍在[0~整型常量表達(dá)式-1],否則越界一維數(shù)組類型(數(shù)組定義)表5.2數(shù)組元素及元素地址的表示(數(shù)組定義:inta[5];)表示意義等價(jià)表示a數(shù)組第一個(gè)元素的地址,是指針常量&a[0]a+i(0≤i≤4)第i+1個(gè)元素的地址,是指針常量表達(dá)式,不可被修改&a[i]&a[i](0≤i≤4)a+i*(a+i)(0≤i≤4)第i+1個(gè)元素的間接引用表達(dá),是基類型的變量a[i]a[i](0≤i≤4)第i+1個(gè)元素的下標(biāo)(索引)表達(dá),是基類型的變量*(a+i)總結(jié):一維數(shù)組元素的地址有兩種等價(jià)表示:a+i==&a[i];一維數(shù)組元素有兩種等價(jià)表示:*(a+i)==a[i]2009.8朱立華俞瓊王立柱15一維數(shù)組類型(初始化)一維數(shù)組的初始化:在定義數(shù)組時(shí)為其全部或部分元素指定初值。一維數(shù)組的初始化的形式:類型標(biāo)識(shí)符一維數(shù)組名[整型常量表達(dá)式]={常量1[,常量2,…,常量n]};正確的初始化示例:inta[5]={1,2,3,4,5};inta[]={1,2,3,4,5}; inta[5]={1,2*4}; 錯(cuò)誤的初始化示例:

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

2009.8朱立華俞瓊王立柱16所有元素都有初值,a[0]至a[4]的值依次為1,2,3,4,5相當(dāng)于a[5]={1,2,3,4,5};當(dāng)所有元素都有初值時(shí),數(shù)組元素個(gè)數(shù)可缺省,自動(dòng)等于初值個(gè)數(shù)相當(dāng)于a[5]={1,8,0,0,0};可以只對(duì)數(shù)組的前幾個(gè)元素賦初值,其余元素的初值自動(dòng)為0。注意!當(dāng)不做初始化時(shí)所有數(shù)組元素的值均為隨機(jī)數(shù)而不是0對(duì)數(shù)組元素初始化時(shí)只能從左到右依次,只能缺省最右邊的元素值初值個(gè)數(shù)不能超過數(shù)組元素的個(gè)數(shù)一維數(shù)組類型(賦值)一維數(shù)組定義(包括初始化)結(jié)束之后,只能對(duì)其元素進(jìn)行訪問,而不能對(duì)數(shù)組整體訪問錯(cuò)誤的數(shù)組賦值示例:

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

b=a;

正確做法可以是:

b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];最簡(jiǎn)潔通用的方法是:(設(shè)已有變量定義:inti;)for(i=0;i<5;i++)b[i]=a[i];2009.8朱立華俞瓊王立柱17錯(cuò)誤原因:a[5]是對(duì)某個(gè)數(shù)組元素的引用,而長(zhǎng)度為5的數(shù)組沒有a[5]這個(gè)元素,不能用一組值給一個(gè)元素賦值錯(cuò)誤原因:數(shù)組名a在賦值語句中是指向第1個(gè)數(shù)組元素的指針常量&a[0],常量不是左值,不能被賦值。錯(cuò)誤原因:一個(gè)數(shù)組不能給另一個(gè)數(shù)組初始化

錯(cuò)誤原因:一個(gè)數(shù)組不能給另一個(gè)數(shù)組整體賦值

一維數(shù)組類型(舉例)程序5.2

編程定義并初始化一維數(shù)組,顯示一維整型數(shù)組所有元素的值及對(duì)應(yīng)地址,并對(duì)數(shù)組的所有元素求和思路:(1)首先需要定義并初始化數(shù)組(假設(shè)數(shù)組名為a),根據(jù)題意,還需要定義循環(huán)控制變量和累加器變量(2)然后分別用一層循環(huán)輸出所有的元素值、地址值(3)再用一層循環(huán)求所有元素之和,最后輸出和值程序5.3從鍵盤上輸入n(1≤n≤10)個(gè)整數(shù),輸出這些元素,再分別統(tǒng)計(jì)其中正數(shù)和負(fù)數(shù)的個(gè)數(shù),并求出最大值與最小值思路:2009.8朱立華俞瓊王立柱18元素值有兩種等價(jià)表示:a[i]和*(a+i)元素地址有兩種等價(jià)表示:&a[i]和a+i(1)首先需要定義數(shù)組以存儲(chǔ)n個(gè)整數(shù),再用一層循環(huán)輸出元素值(2)然后分別用一層循環(huán)作統(tǒng)計(jì)、找最大最小值(3)最后輸出結(jié)果

動(dòng)態(tài)演示過程程序5.3:源程序代碼

#include<stdio.h>intmain(){inta[10],i,n;

intmax,min;

intpositive=0,negative=0;do{ printf("Pleaseinputn(1<=n<=10):\n"); scanf("%d",&n);}while(n<1||n>10);printf("Pleaseinput%delements:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);printf("Theelementsare:\n");for(i=0;i<n;i++)

printf("%5d",a[i]);printf("\n");2009.8朱立華俞瓊王立柱19保證讀入的n在1至10之間讀入數(shù)組的前n個(gè)元素輸出數(shù)組的元素程序5.3:源程序代碼

for(i=0;i<n;i++) if(a[i]>0)positive++;

elseif(a[i]<0)negative++;max=min=a[0];for(i=1;i<n;i++){

if(*(a+i)>max)max=*(a+i);

elseif(*(a+i)<min)min=*(a+i);}printf("positive=%d\n",positive);printf("negative=%d\n",negative);printf("maxelement=%d\n",max);printf("minelement=%d\n",min);return0;}2009.8朱立華俞瓊王立柱20統(tǒng)計(jì)正數(shù)個(gè)數(shù)統(tǒng)計(jì)負(fù)數(shù)個(gè)數(shù)尋找最大元素尋找最小元素輸出結(jié)果動(dòng)態(tài)演示過程?思考:為什么這里的if不能省略??思考:為什么這里的if不能省略?(選講)一維數(shù)組名的雙重含義回顧:intm;--->m是一個(gè)整型變量的變量名,代表整型變量空間,m的類型標(biāo)識(shí)為int同理:inta[5];--->a是一個(gè)數(shù)組變量的變量名,代表整個(gè)數(shù)組空間,a的類型標(biāo)識(shí)為int[5]因此,數(shù)組名a有雙重含義:(1)是一個(gè)數(shù)組變量的變量名,代表整個(gè)數(shù)組空間,在&a,sizeof(a)中體現(xiàn)該含義,但是數(shù)組變量不能通過其名稱直接引用數(shù)組元素,因此數(shù)組名稱“退化”了(2)是指向第一個(gè)數(shù)組元素的指針常量,所有元素的地址可根據(jù)該常量的地址值計(jì)算求得,從而方便實(shí)現(xiàn)間接訪問數(shù)組的元素程序5.4

設(shè)計(jì)程序驗(yàn)證d與&d的區(qū)別,重點(diǎn)關(guān)注d+1與&d+1的不同2009.8朱立華俞瓊王立柱21動(dòng)態(tài)演示過程(選講)一維數(shù)組名的雙重含義2009.8朱立華俞瓊王立柱22名稱意義類型基類型運(yùn)算或關(guān)系數(shù)組元素d[0]~d[4]

類型相同的變量double無實(shí)型變量運(yùn)算、取址運(yùn)算&

數(shù)組指針d指向第一個(gè)數(shù)組元素的指針常量double*doubled=&d[0],d+i=&d[i],*(d+i)=d[i](i=0~4)數(shù)組空間名稱d數(shù)組變量(空間)的標(biāo)識(shí)符double[5]無sizeof(d)=5*8=40,&d

數(shù)組空間取址&d整個(gè)數(shù)組空間的首地址double*[5]double[5]+、-、間接引用*&d與數(shù)組指針d的值雖然相等,但是d的類型是double*,基類型是數(shù)組元素類型double;而&d的類型是double(*)[5],基類型是double[5]。執(zhí)行d+1,地址增加8,執(zhí)行&d+1,地址增減40。數(shù)組名具體代表什么意思,要依賴上下文而定,如下表:一級(jí)指針變量與一維數(shù)組引入數(shù)組的目的:傳遞數(shù)組首元素地址,相當(dāng)于傳遞整個(gè)數(shù)組空間所有元素的值。數(shù)組首元素地址可以傳給?——基類型相同的指針變量指針變量的定義:回顧:整數(shù)類型int--->

整型變量intx;同理:基類型為整型的指針類型int*--->

指針變量int*x;一維數(shù)組名是指針常量,當(dāng)然可以將值賦給基類型相同的指針變量,使指針變量和數(shù)組指針在間接引用方式下“共享”同一段數(shù)組空間,這相當(dāng)于把數(shù)組空間的數(shù)據(jù)傳給了指針變量,稱為地址傳遞,例:inta[5];int*p=a;2009.8朱立華俞瓊王立柱23a[0]a[1]a[2]a[3]a[4]13ff58app[0]p[1]p[2]p[3]p[4]13ff58一級(jí)指針變量與一維數(shù)組當(dāng)p=a后,有下列等價(jià)關(guān)系存在:(1)數(shù)組元素的表示:

下標(biāo)法:p[i]等價(jià)于a[i]

間接引用法:*(p+i)等價(jià)于*(a+i)(2)數(shù)組元素地址的表示:

指針表達(dá)式法:p+i等價(jià)于a+i

元素取地址法:&p[i]等價(jià)于&a[i]注意:(1)p是變量,因此它有存儲(chǔ)空間可以取地址,即&p是指向p存儲(chǔ)空間的指針常量,其基類型為int*

(2)p是變量,一般獲得數(shù)組首元素地址值,也可以獲得任意元素的地址值,例:p=&a[2]此時(shí):p[0]等價(jià)于a[2],p[2]等價(jià)于a[4]程序5.5:用一級(jí)指針訪問一維數(shù)組元素示例2009.8朱立華俞瓊王立柱24a[0]a[1]a[2]a[3]a[4]13ff58app[0]p[1]p[2]p[3]p[4]13ff5813ff60p[0]p[1]p[2]動(dòng)態(tài)演示過程一級(jí)指針變量與一維數(shù)組一級(jí)指針變量定義時(shí)*的位置:情況1:只定義一個(gè)指針變量,此時(shí)*位置可以近基類型名、近變量名或居中三者均可例:int*p; int*p; int*p; 情況2:一條定義語句既定義基類型的變量,又定義指針變量,此時(shí),*近指針變量例:inta,*p,b; 情況3:一條定義語句定義多個(gè)同類型的指針變量時(shí),每個(gè)指針變量前都跟一個(gè)*號(hào)例:int*p,*q; 簡(jiǎn)單總結(jié):(1)“*”貼近指針變量總是正確的(2)每個(gè)指針變量前面都必須有一個(gè)“*”

2009.8朱立華俞瓊王立柱25近變量名近基類型名居中必須近變量名一級(jí)指針變量與一維數(shù)組關(guān)于數(shù)組指針的基類型與指針變量基類型的一致性問題目的1:如果傳遞數(shù)組指針的目的是傳遞數(shù)組的值,那么應(yīng)該將數(shù)組指針傳遞給同類型的指針變量,類型不同時(shí)雖然可通過強(qiáng)制類型轉(zhuǎn)換賦值,但無意義例:inta[5]={10,15,20,25,30};double*pd;pd=(double*)a; float*pf;pf=(float*)a; 目的2:如果傳遞數(shù)組指針的目的在于高效使用內(nèi)存資源,那么可以通過強(qiáng)制類型轉(zhuǎn)換把該數(shù)組空間指針傳遞給其他類型的指針變量,把用過的數(shù)組空間用來存儲(chǔ)其他類型的數(shù)據(jù)。程序5.6

同一段空間,可用作不同類型的數(shù)組空間示例2009.8朱立華俞瓊王立柱26強(qiáng)制類型轉(zhuǎn)換使賦值有效但無意義,因?yàn)閜d+i≠a+i且pd[i]≠

a[i]

強(qiáng)制類型轉(zhuǎn)換使賦值有效但無意義,因?yàn)殡m然pf+i==a+i但pf[i]≠

a[i]

動(dòng)態(tài)演示過程這樣做雖然節(jié)省了空間,但是容易引起數(shù)據(jù)訪問的歧義實(shí)際編程中這種方法不常用

一級(jí)指針變量與一維數(shù)組一個(gè)基類型的變量等價(jià)于長(zhǎng)度為1的數(shù)組定義inta[4];intn=5;分析的對(duì)象a&n對(duì)象的性質(zhì)長(zhǎng)度為4的整型數(shù)組指針常量長(zhǎng)度為1的整型數(shù)組指針常量訪問第一個(gè)元素a[0]==*(a+0)&n[0]==*(&n+0)=*(&n)=n若有int*p;給p的賦值p=a;p=&n;用p間接訪問元素p[0]==*(p+0)=*pp[0]==*(p+0)=*p,直接用*p結(jié)論:intn,*p;則n相當(dāng)于長(zhǎng)度為1的數(shù)組&n的唯一元素,賦值給p之后,存在兩組等價(jià)關(guān)系:p==&n;*p==n;但&n為常量,p為變量2009.8朱立華俞瓊王立柱27一級(jí)指針變量與一維數(shù)組取址運(yùn)算&和間接引用運(yùn)算*互為逆運(yùn)算二者都是第2優(yōu)先級(jí)的運(yùn)算符,結(jié)合方向?yàn)閺挠蚁蜃?。需要注意,運(yùn)算的每一步都要保證有意義。例:intn,m=5,*p=&m;則有5組等價(jià)關(guān)系:

(1)p==&m;(2)*p=m;(3)&*p=p;(4)*&p=p(5)*&m=m但是:&*m=m;卻是錯(cuò)誤的,因?yàn)閙不代表地址,所以*m無意義?;仡櫛?.1的內(nèi)容:x=*(double*)0x12ff70

兩邊同時(shí)進(jìn)行取址運(yùn)算“&”,再消掉互逆運(yùn)算符得到:

&x=&*(double*)0x12ff70=(double*)0x12ff70

最左和最右同時(shí)進(jìn)行間接引用運(yùn)算“*”,再消掉互逆運(yùn)算符得到:*&x=*(double*)0x12ff70=x2009.8朱立華俞瓊王立柱28一級(jí)指針變量與一維數(shù)組野指針:是指向”垃圾”內(nèi)存的指針,有以下幾種情況(1)指針變量沒有被賦值,它存儲(chǔ)的地址是不確定的例:int*p; *p=100; (2)指針操作超越了變量的作用范圍例:inta[3],*p=a;p=p+3;*p=100; (3)一個(gè)字面值指針常量,例如(int*)0x12ff7c,如果其值0x12ff7c不是系統(tǒng)已經(jīng)分配給用戶程序使用的空間地址。因此一般編程時(shí)很少直接使用字面值指針常量進(jìn)行間接引用(4)利用指針申請(qǐng)的動(dòng)態(tài)空間被釋放后,仍用該指針進(jìn)行間接訪問(具體見第6章6.5.3)2009.8朱立華俞瓊王立柱29一個(gè)沒有賦值的“野”指針用“野”指針間接引用很危險(xiǎn)指針獲得數(shù)組首元素地址指針增加3,出了數(shù)組范圍間接引用的空間不是程序的有效數(shù)據(jù)空間一級(jí)指針變量與一維數(shù)組void型指針:稱為通用指針或泛指針??梢园讶魏晤愋妥兞康牡刂焚x給它,但是不能利用這樣的指針做相應(yīng)類型的訪問或處理。例:void*p; intx=5;p=&x; //合法*p=6; //非法printf("%d",*p); //非法void指針主要用于單純的內(nèi)存數(shù)據(jù)的拷貝。在第11章的“流與文件”中,將遇到這樣的指針。2009.8朱立華俞瓊王立柱30一級(jí)指針變量與一維數(shù)組回顧:當(dāng)一級(jí)指針變量的基類型與一維數(shù)組的基類型一致時(shí),可以將一維數(shù)組名賦值給指針變量,這時(shí)對(duì)數(shù)組元素的訪問既可以用一維數(shù)組也可以用指針變量。用一維數(shù)組訪問數(shù)組的元素只能通過改變下標(biāo)的方式用一級(jí)指針變量間接訪問一維數(shù)組的元素可以通過移動(dòng)下標(biāo)(指針不動(dòng))或移動(dòng)指針(指針改變)兩種方式程序5.7分別用移動(dòng)下標(biāo)的方法和移動(dòng)指針的方法實(shí)現(xiàn)輸出數(shù)組的所有元素。在方法1中,pa[i++]實(shí)際上先訪問pa[i],再執(zhí)行i=i+1,當(dāng)循環(huán)結(jié)束時(shí),指針pa還是等于a即&a[0],pa[i++]也可寫成a[i++]在方法2中,*pa++相當(dāng)于*(pa++),這里是后++,因此相當(dāng)于先訪問*pa,再執(zhí)行pa=pa+1,當(dāng)循環(huán)結(jié)束時(shí),pa等于a+5。由于a是常量,故*pa++不能寫成*a++2009.8朱立華俞瓊王立柱31動(dòng)態(tài)演示過程一級(jí)指針變量與一維數(shù)組移動(dòng)下標(biāo)與移動(dòng)指針訪問數(shù)組的元素例示:程序5.8調(diào)用隨機(jī)函數(shù)產(chǎn)生10個(gè)1至100內(nèi)的整數(shù)作為數(shù)組的元素,然后再逆置存放,輸出初始序列和逆置以后的序列。問題分析:本題中首先需要定義一個(gè)含10個(gè)元素的整型數(shù)組,數(shù)組的元素值需要在一個(gè)循環(huán)體中通過調(diào)用隨機(jī)函數(shù)逐個(gè)賦值,然后用循環(huán)輸出所有元素。接下來是數(shù)組的逆置,最簡(jiǎn)單的方法是從兩邊向中間對(duì)應(yīng)位置的元素兩兩互換。方法一:采用移動(dòng)下標(biāo)法,用i和j分別指示待交換的兩個(gè)元素的下標(biāo),i從0開始遞增,j從9開始遞減,循環(huán)條件為i<j。方法二:采用移動(dòng)指針法,設(shè)兩個(gè)指針p和q分別指向第一個(gè)元素和最后一個(gè)元素,交換對(duì)應(yīng)的*p和*q,然后p++同時(shí)q--,循環(huán)條件為p<q。2009.8朱立華俞瓊王立柱32動(dòng)態(tài)演示過程方法一動(dòng)態(tài)演示過程方法二一級(jí)指針變量與一維數(shù)組程序5.8方法一核心代碼for(i=0,j=9;i<j;i++,j--){ temp=a[i]; a[i]=a[j]; a[j]=temp;}等效于:(只用i控制下標(biāo))for(i=0;i<10/2;i++){ temp=a[i]; a[i]=a[10-1-i]; a[10-1-i]=temp;}

2009.8朱立華俞瓊王立柱33程序5.8方法二核心代碼for(p=a,q=a+9;p<q;p++,q--){ temp=*p; *p=*q; *q=temp;} 等效于:(只用p控制指針變化)for(p=a;p<a+10/2;p++){ temp=*p; *p=*(a+10-1-(p-a)); *(a+10-1-(p-a))=temp;}

一維數(shù)組應(yīng)用舉例(查找)應(yīng)用之一——

在數(shù)組中查找一個(gè)元素查找算法很多,這里只介紹最簡(jiǎn)單的順序查找法.數(shù)組元素的初始序列值無任何要求,即不要求有序。查找的過程:只能是從第一個(gè)元素開始依次與待查找的元素進(jìn)行比較,如果相等就查找成功,輸出元素及對(duì)應(yīng)下標(biāo);如果與所有元素都比較結(jié)束仍沒有相等元素,則輸出元素不存在的提示信息。程序5.9從鍵盤上輸入n(1≤n≤10)個(gè)整數(shù)作為數(shù)組a的元素值,再讀入一個(gè)待查找的整數(shù)x,在a數(shù)組中查找x,如果存在輸出它的下標(biāo),否則提示:“Notpresent!”

提示:本程序完整的循環(huán)條件:i<n&&x!=*(p+i)

2009.8朱立華俞瓊王立柱34動(dòng)態(tài)演示過程一維數(shù)組應(yīng)用舉例(插入)應(yīng)用之二

——

向數(shù)組中插入一個(gè)元素

插入算法有很多種,本程序是要求在有序數(shù)組中插入一個(gè)數(shù)據(jù)元素,并保持?jǐn)?shù)組有序。具體步驟是:(1)確定待插入位置(此步驟伴隨著查找過程);(2)元素后移,騰出相應(yīng)位置(用遞減循環(huán)實(shí)現(xiàn),后移就是作形如a[j+1]=a[j];的賦值)(3)在“空”位置上插入新元素(作一次賦值)程序5.10整型數(shù)組a

溫馨提示

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

評(píng)論

0/150

提交評(píng)論