C語言程序設(shè)計(jì)立體化教程(第二版) 課件 項(xiàng)目6 指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理_第1頁
C語言程序設(shè)計(jì)立體化教程(第二版) 課件 項(xiàng)目6 指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理_第2頁
C語言程序設(shè)計(jì)立體化教程(第二版) 課件 項(xiàng)目6 指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理_第3頁
C語言程序設(shè)計(jì)立體化教程(第二版) 課件 項(xiàng)目6 指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理_第4頁
C語言程序設(shè)計(jì)立體化教程(第二版) 課件 項(xiàng)目6 指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

主講:廖智蓉項(xiàng)目6指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理指針指針基礎(chǔ)1、地址地址——內(nèi)存單元的編號(hào)(在計(jì)算機(jī)中,把內(nèi)存區(qū)劃 分為一個(gè)一個(gè)的存儲(chǔ)單元,每個(gè)單元為一個(gè)字節(jié),它 們都有一個(gè)編號(hào),這個(gè)編號(hào)就是內(nèi)存地址)

取地址運(yùn)算——&

例如inta;scanf(“%d”,&a);//存數(shù)據(jù)printf(“%x\n”,&a);//查看a變量本機(jī)上內(nèi)存單元編號(hào)注意:&不能施加在常量或表達(dá)式前。指針基礎(chǔ)2、指針——一個(gè)變量在內(nèi)存中存儲(chǔ)時(shí)的地址。簡(jiǎn)單地說,指針就是地址。二者是同一個(gè)概念的兩種說法。只不過指針更形象一些,就像一個(gè)針一樣,可以指向某個(gè)地方。指針基礎(chǔ)3、指針變量——存放其他變量地址的變量稱為指針變量….3510ab240ff52240ff56p240ff52q240ff56結(jié)論:a,b為一般的整型變量,p和q分別存儲(chǔ)了a和b變量的單元編號(hào)(地址),即p、q是指針變量。指針變量的定義一般形式:[存儲(chǔ)類型]數(shù)據(jù)類型*指針變量名如:int*p,a=3;

int*q,b=5;

說明

a.*是定義指針變量的標(biāo)志,不可丟掉。

b.數(shù)據(jù)類型是指針變量所指向的變量的類型。

c.指針變量定義后,其值是不確定的。指針變量的初始化1、定義指針變量時(shí)進(jìn)行賦值如:int*p=&a,a=3;2、先定義指針變量再進(jìn)行賦值如:int*p,a=3;

p=&a;注意:只能用同類型變量的地址進(jìn)行賦值!如:int*s;floatf;則s=&f;是非法的。指針變量的引用*—指針運(yùn)算,則代表取指針?biāo)赶虻膯卧膬?nèi)容。#include"stdio.h"main(){inta,*p;p=&a;*p=100;printf("%d\n",a);}#include"stdio.h"main(){inta=88,*p;p=&a;printf("%d\n",*p);}*作用的說明區(qū)分:*運(yùn)算符在不同場(chǎng)合的作用,編譯器能夠根據(jù)上下文環(huán)境判別*的作用。inta,b,c;int*p;(*表示定義指針)p=&a;*p=100;(*表示指針運(yùn)算符)c=a*b;(*表示乘法運(yùn)算符)舉例使用直接和間接方式輸入整數(shù)a,b的值,并且同樣使用兩種不同的方法輸出。//直接方式#include<stdio.h>main(){inta,b;scanf(“%d%d”,&a,&b);printf(“%d%d”,a,b);}//間接方式#include<stdio.h>main(){inta,b,*p,*q;p=&a;q=&b;scanf(“%d%d”,p,q);printf(“%d%d”,*p,*q);}

課后練一練

預(yù)習(xí)下講指針與數(shù)組主講:廖智蓉項(xiàng)目6指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理指針與數(shù)組復(fù)習(xí)數(shù)組a[0]a[1]a[2]a[3]a[4]復(fù)習(xí):一維數(shù)組在內(nèi)存中的存放方法?

inta[5];數(shù)組元素的地址:&a[i]數(shù)組首地址:&a[0]或a指針與一維數(shù)組inta[5];//定義一個(gè)5個(gè)元素的整型數(shù)組int*p; //定義一個(gè)指向整型變量的指針變量p=a;在數(shù)組中,數(shù)組名表示該數(shù)組的首地址,即第一個(gè)元素的地址,它是一個(gè)常量。因此p=a;與p=&a[0];等價(jià),都代表將數(shù)組首地址賦值給指針變量p,即指針變量p指向a數(shù)組的第一個(gè)元素。如圖所示。指針與一維數(shù)組在p指向首地址前提下,如依次進(jìn)行以下操作,指針變量p將不斷地指向新的數(shù)組元素。(1)p++;則表示p向后移動(dòng)一個(gè)位置,指向a[1](2)p--;則表示p向前移動(dòng)一個(gè)位置,重新指向a[0](3)p=p+3;則表示p向后移動(dòng)三個(gè)位置,指向a[3]指針與一維數(shù)組1、指針與一維數(shù)組的對(duì)應(yīng)關(guān)系

inta[10],*p=a;使p指向a數(shù)組的第一個(gè)元素a[0]各元素的指針按存儲(chǔ)單元遞增a[0]a[2]a[4]a[3]a[6]a[7]a[1]a[5]a[8]a[9]memorypp+1p+2p+92、用指針訪問數(shù)組的一般形式對(duì)下標(biāo)為i的元素訪問:

a[i],*(a+i),*(p+i)對(duì)a[i]的地址表示:

&a[i],a+i,p+i

指向數(shù)組訪問數(shù)組的兩種方式:下標(biāo)方式,指針方式指針與一維數(shù)組(1)下標(biāo)法(常用,很直觀)#include<stdio.h>main(){intscore[10],i;printf("請(qǐng)輸入10個(gè)學(xué)生的成績\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("輸出的10個(gè)學(xué)生的成績?yōu)閈n");for(i=0;i<10;i++)printf("%3d",score[i]);printf("\n");}(2)用數(shù)組名計(jì)算數(shù)組元素的地址。(效率與下標(biāo)法相同,不常用)#include<stdio.h>main(){intscore[10],i;printf("請(qǐng)輸入10個(gè)學(xué)生的成績\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("輸出的10個(gè)學(xué)生的成績?yōu)閈n");for(i=0;i<10;i++)printf("%3d",*(score+i));printf("\n");}指針與一維數(shù)組(3)用指針訪問各元素。(常用,效率高)#include<stdio.h>main(){intscore[10],*p,i;printf("請(qǐng)輸入10個(gè)學(xué)生的成績\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("輸出的10個(gè)學(xué)生的成績?yōu)閈n");for(p=score;p<score+10;p++)printf("%3d",*p);printf("\n");}

指針與字符數(shù)組

(一)字符串的表示形式1.用字符數(shù)組實(shí)現(xiàn)#include<stdio.h>main(){charstring[]="IloveChina!";printf("%s\n",string);}2.用字符指針實(shí)現(xiàn)

#include<stdio.h>main(){char*string="IloveChina!";printf("%s\n",string);}一、字符串的表現(xiàn)形式

C語言中,有兩種方式可以實(shí)現(xiàn)字符串:字符數(shù)組、字符指針。

指針與字符數(shù)組

舉例

#include<stdio.h>main(){char*ps="thisisabook";intn=10;ps=ps+n;printf("%s\n",ps);}輸出字符串中n個(gè)字符后的所有字符。ps+10ps

舉例

在輸入的字符串中查找有無‘k’字符。#include<stdio.h>main(){charst[20],*ps;inti;printf("inputastring:\n");ps=st;scanf("%s",ps);for(i=0;ps[i]!='\0';i++)if(ps[i]=='k'){printf("thereisa'k'inthestring\n");break;}if(ps[i]=='\0')printf("Thereisno'k'inthestring\n");}

舉例

將字符串a(chǎn)復(fù)制到字符串b。方法一#include<stdio.h>voidmain(){chara[]="Iamaboy.",b[20],*p1,*p2;inti;p1=a;p2=b;

for(;*p1!='\0';p1++,p2++)*p2=*p1;*p2='\0';printf("stringais:%s\n",a);printf("stringbis:%s\n",b);printf("\n");}方法二#include<stdio.h>voidmain(){char*a="Iamaboy.",*b;

b=a;printf("stringais:%s\n",a);printf("stringbis:%s\n",b);printf("\n");}注意:若a,b都是字符指針,則可以用b=a,即將a的地址賦給b,但是若a,b是字符數(shù)組,則不能用b=a,應(yīng)用strcpy(b,a)

比較

字符數(shù)組與字符串指針變量的區(qū)別存放的是首地址字符數(shù)組字符串指針變量每個(gè)元素放一個(gè)字符不能整體賦值chars[6];s=“abcde”;/*不對(duì)*/可以整體賦值char*p;

p=“abcde”;chars[6];使用s不能加/減p可以加/減

課后練一練

1、用指針實(shí)現(xiàn):

輸入一個(gè)字符串,把其中大寫字母變成小寫字母。2、利用指針來實(shí)現(xiàn):在輸入任意的字符串中查找有無‘k’字符。預(yù)習(xí)下講指針數(shù)組主講:廖智蓉項(xiàng)目6指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理指針數(shù)組指針數(shù)組定義格式:類型標(biāo)識(shí)*數(shù)組名[數(shù)組長度]

功能:指向一維數(shù)組的指針變量。

說明:適合于指向若干個(gè)字符串,使字符串處理更加方便靈活。

指針數(shù)組中每一個(gè)元素都是一個(gè)指針變量,并且它們具有相同的數(shù)據(jù)類型。char*p[4];舉例

輸入一個(gè)0至6之間的整數(shù),輸出相對(duì)應(yīng)的星期英文單詞。#include<stdio.h>main(){

char*week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

inti;while(1){printf("EnterweekNo:");scanf("%d",&i);if(i<0||i>6)break;printf("WeekNo.%d--%s\n",i,week[i]);}} 練一練#include<stdio.h>main(){inti,j;char*s[4]={“continue”,“break”,“do-while”,“point”};for(i=0;i<4;i++)printf("%s\n",s[i]+i);}輸出結(jié)果是什么?s[0]s[1]s[2]s[3]閱讀代碼#include<stdio.h>voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf("%d%d",&a,&b);if(a<b)swap(a,b);printf("%d,%d\n",a,b);}如何用函數(shù)調(diào)用的方式實(shí)現(xiàn)兩個(gè)數(shù)的調(diào)換?請(qǐng)問下列代碼能實(shí)現(xiàn)嗎?形參不能傳遞給實(shí)參!此方法不能實(shí)現(xiàn)兩個(gè)數(shù)的調(diào)換!指針變量作函數(shù)參數(shù)#include<stdio.h>voidswap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}main(){inta,b;scanf("%d%d",&a,&b);if(a<b)swap(&a,&b);printf("%d,%d\n",a,b);}注意:

指針變量作為函數(shù)的參數(shù),從實(shí)參向形參的數(shù)據(jù)傳遞仍然遵循“單向值傳遞”的原則,只不過此時(shí)傳遞的是地址.xyab46temp464

思考

#include<stdio.h>voidswap(int*x,int*y){int*temp;temp=x;x=y;y=temp;}main(){inta,b;scanf("%d%d",&a,&b);if(a<b)swap(&a,&b);printf("%d,%d\n",a,b);}形參是指針就一定能實(shí)現(xiàn)兩個(gè)數(shù)的交換嗎?請(qǐng)分析下列代碼?注意:

指針變量作為函數(shù)的參數(shù),只有交換的內(nèi)容才能實(shí)現(xiàn)實(shí)參兩個(gè)數(shù)的交換.xyab46tempxy

舉一反三

輸入a、b、c3個(gè)整數(shù),按從大到小順序輸出。#include<stdio.h>voidswap(int*a,int*b){intt;t=*a;*a=*b;*b=t;}

voidmain(){inta,b,c,*p1,*p2,*p3;printf("請(qǐng)輸入3個(gè)數(shù),以逗號(hào)隔開:");scanf("%d,%d,%d",&a,&b,&c);p1=&a;p2=&b;p3=&c;if(a<b)swap(p1,p2);if(a<c)swap(p1,p3);if(b<c)swap(p2,p3);printf("從大到小的順序?yàn)?");printf("%d,%d,%d\n",a,b,c);}預(yù)習(xí)下講指向結(jié)構(gòu)體數(shù)組的指針主講:廖智蓉項(xiàng)目6指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理指向結(jié)構(gòu)體和結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體一個(gè)結(jié)構(gòu)體變量的指針就是該變量在內(nèi)存中的起始地址。1.指向結(jié)構(gòu)體變量的指針定義和賦值例:structstudentstu1,*sp;sp=&stu1;結(jié)構(gòu)體指針變量定義指向結(jié)構(gòu)體指針變量的賦值指向結(jié)構(gòu)體(2)結(jié)構(gòu)體指針變量引用結(jié)構(gòu)體變量。

(*sp).成員名

sp->成員名例如:(*sp).id,(*sp).name,(*sp).avg或sp->avg結(jié)構(gòu)體成員的引用方法:(1)用結(jié)構(gòu)體變量名引用結(jié)構(gòu)體成員。

這種方法我們?cè)谇懊嬉呀?jīng)學(xué)習(xí)過。如:stu1.id,,sut1.sex,stu1.avg等。舉例用結(jié)構(gòu)體指針變量引用的方式輸出一個(gè)學(xué)生的信息。#include"stdio.h"main(){struct{charid[6],name[10];intm1,m2,m3;floatavg;}x={"00101","李小明",87,88,92},*sp;sp=&x;printf("%s\t%s\t%5d%5d%5d\n",sp->id,sp->name,sp->m1,sp->m2,sp->m3);printf("%s\t%s\t%5d%5d%5d\n",(*sp).id,(*sp).name,(*sp).m1,(*sp).m2,(*sp).m3);}指向結(jié)構(gòu)體數(shù)組的指針structstudent{charid[6];charname[10];intm1,m2,m3;floatavg,sum;}stu1[10];//定義結(jié)構(gòu)體數(shù)組。

structstudent*sp;//定義結(jié)構(gòu)體類型指針。

sp=stu1;//將結(jié)構(gòu)體數(shù)組首地址送給結(jié)構(gòu)體指針。說明:當(dāng)前sp指針指向數(shù)組首地址。

執(zhí)行sp++后指針指向下一個(gè)數(shù)組單元;執(zhí)行sp--后指針指向上一個(gè)數(shù)組單元。所以使用指針變量可以方便的在結(jié)構(gòu)體數(shù)組中移動(dòng)。舉例用結(jié)構(gòu)體指針變量引用的方式輸出學(xué)生的信息。#include"stdio.h"#defineN3structstu{charid[6];charname[10];intm1,m2,m3;floatavg,sum;};main(){stustudent[N]={{"001","李小明",78,89,90},{"008","陳小東",85,81,67},{"016","王永民",89,78,90}},*sp;inti;sp=student;for(i=0;i<N;i++,sp++){sp->sum=sp->m1+sp->m2+sp->m3;sp->avg=sp->sum/3.0;}sp=student;printf("他們的成績單為:\n");printf("學(xué)號(hào)\t姓名\t數(shù)學(xué)英語

語文

總分

平均分\n");for(i=0;i<N;i++,sp++)printf("%s\t%s\t%d%6d%7d%7.1f%6.1f\n",(*sp).id,(*sp).name,(*sp).m1,(*sp).m2,(*sp).m3,(*sp).sum,(*sp).avg);}#include<stdio.h>#include<math.h>#include<stdlib.h>voidmain(){inti,n;structaxy{floatx,y;};/*****1*****/structaxya;/*****2*****/scanf("%d",n);a=(structaxy*)malloc(n*sizeof(structaxy));for(i=0;i<n;i++)scanf("%f%f",&a[i].x,&a[i].y);/*****3******/for(i=1;i<=n;i++) if(sqrt(pow(a[i].x,2)+pow(a[i].y,2))<=5){ printf("%f,",a[i].x); /***************4**************/printf("%f\n",a+i->y); }}

練一練修改錯(cuò)誤,帶有星號(hào)的下一行有錯(cuò)。struct

axy

*a;scanf("%d",&n);for(i=0;i<n;i++);printf(“%f\n”,(a+i)->y;printf(“%f\n”,a[i]->y;

課后練一練

用指針指向結(jié)構(gòu)體數(shù)組實(shí)現(xiàn):下列信息輸入和輸出。學(xué)號(hào)姓名性別QQ聯(lián)系電話1701001張穎女7874637137237823341701002李楠男9887773131458479891701003王強(qiáng)男123456713679898035預(yù)習(xí)下講指針與二維數(shù)組主講:廖智蓉項(xiàng)目6指針實(shí)現(xiàn)學(xué)生綜合測(cè)評(píng)成績管理指針與二維數(shù)組二維數(shù)組結(jié)構(gòu)設(shè)有數(shù)組定義為:inta[3][4];則有:

a表示數(shù)組在內(nèi)存中的首地址。

a+i=a[i]=&a[i][0]代表第i行的首地址二維數(shù)組結(jié)構(gòu)二維數(shù)組的邏輯結(jié)構(gòu)圖如下:a[0][3]a[0][2]a[0][1]a[0][0]a[1][3]a[1][2]a[1][1]a[1][0]a[2][3]a[2][2]a[2][1]a[2][0]a[0]a[1]a[2]a+0a+2a+1閱讀代碼#include<stdio.h>main(){inta[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};printf("%d,",a);//第0行首地址printf("%d,",a[0]);//第0行0列地址printf("%d\n",&a[0][0]);//第0行0列地址printf("%d,",a+1);//第1行首地址printf("%d,",*(a+1));//第1行0列地址printf("%d,",&a[1]);printf("%d\n",&a[1][0]);}輸出二維數(shù)組有關(guān)值舉例用指針變量輸出二維數(shù)組元素。#include<stdio.h>main(){inta[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};inti,*p=a[0];for(i=0;i<12;i++,p++){printf("%5d",*p);if((i+1)%4==0)printf("\n");}}指向指針的指針如果一個(gè)指針變量存放的又是另一個(gè)指針變量的地址,則稱這個(gè)指針變量為指向指針的指針變量。定義格式:類型標(biāo)識(shí)符**指針變量名如:char**p;應(yīng)用#include<stdio.h>main(){staticchar*name[]={"Illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};

char**ps;//定義一個(gè)指向字符指針變量的指針變量psinti;printf("inputD

溫馨提示

  • 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)論