版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 年度基礎(chǔ)地質(zhì)勘查服務(wù)競(jìng)爭(zhēng)策略分析報(bào)告
- 二零二五年度違約民事起訴狀合同起草技巧與法律適用3篇
- 2024-2025學(xué)年新教材高中數(shù)學(xué)第十章概率單元質(zhì)量評(píng)估含解析新人教A版必修第二冊(cè)
- 2025年度文化旅游項(xiàng)目招投標(biāo)與合同管理規(guī)范解讀3篇
- 2024金融行業(yè)拓展訓(xùn)練合同
- 2025年度新能源居間服務(wù)合同范本英文版3篇
- 二零二五年度留守兒童特殊教育需求與個(gè)性化支持服務(wù)合同4篇
- 2025年度高科技企業(yè)派遣研發(fā)人員合同范本
- 2025版高性能鋁合金模板制造與租賃服務(wù)合同詳盡條款全文4篇
- 2025年度家庭經(jīng)濟(jì)困難子女撫養(yǎng)費(fèi)減免專項(xiàng)合同
- 長亭送別完整版本
- 《鐵路軌道維護(hù)》課件-更換道岔尖軌作業(yè)
- 股份代持協(xié)議書簡(jiǎn)版wps
- 職業(yè)學(xué)校視頻監(jiān)控存儲(chǔ)系統(tǒng)解決方案
- 《銷售心理學(xué)培訓(xùn)》課件
- 智能養(yǎng)老院視頻監(jiān)控技術(shù)方案
- 2024年安徽省公務(wù)員錄用考試《行測(cè)》真題及解析
- 你比我猜題庫課件
- 豐順縣鄉(xiāng)鎮(zhèn)集中式飲用水水源地基礎(chǔ)狀況調(diào)查和風(fēng)險(xiǎn)評(píng)估報(bào)告
- 無人駕駛航空器安全操作理論復(fù)習(xí)測(cè)試附答案
- 2024年山東省青島市中考語文試卷(附答案)
評(píng)論
0/150
提交評(píng)論