版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主讲:廖智蓉项目6指针实现学生综合测评成绩管理指针指针基础1、地址地址——内存单元的编号(在计算机中,把内存区划 分为一个一个的存储单元,每个单元为一个字节,它 们都有一个编号,这个编号就是内存地址)
取地址运算——&
例如inta;scanf(“%d”,&a);//存数据printf(“%x\n”,&a);//查看a变量本机上内存单元编号注意:&不能施加在常量或表达式前。指针基础2、指针——一个变量在内存中存储时的地址。简单地说,指针就是地址。二者是同一个概念的两种说法。只不过指针更形象一些,就像一个针一样,可以指向某个地方。指针基础3、指针变量——存放其他变量地址的变量称为指针变量….3510ab240ff52240ff56p240ff52q240ff56结论:a,b为一般的整型变量,p和q分别存储了a和b变量的单元编号(地址),即p、q是指针变量。指针变量的定义一般形式:[存储类型]数据类型*指针变量名如:int*p,a=3;
int*q,b=5;
说明
a.*是定义指针变量的标志,不可丢掉。
b.数据类型是指针变量所指向的变量的类型。
c.指针变量定义后,其值是不确定的。指针变量的初始化1、定义指针变量时进行赋值如:int*p=&a,a=3;2、先定义指针变量再进行赋值如:int*p,a=3;
p=&a;注意:只能用同类型变量的地址进行赋值!如:int*s;floatf;则s=&f;是非法的。指针变量的引用*—指针运算,则代表取指针所指向的单元的内容。#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);}*作用的说明区分:*运算符在不同场合的作用,编译器能够根据上下文环境判别*的作用。inta,b,c;int*p;(*表示定义指针)p=&a;*p=100;(*表示指针运算符)c=a*b;(*表示乘法运算符)举例使用直接和间接方式输入整数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);}
课后练一练
预习下讲指针与数组主讲:廖智蓉项目6指针实现学生综合测评成绩管理指针与数组复习数组a[0]a[1]a[2]a[3]a[4]复习:一维数组在内存中的存放方法?
inta[5];数组元素的地址:&a[i]数组首地址:&a[0]或a指针与一维数组inta[5];//定义一个5个元素的整型数组int*p; //定义一个指向整型变量的指针变量p=a;在数组中,数组名表示该数组的首地址,即第一个元素的地址,它是一个常量。因此p=a;与p=&a[0];等价,都代表将数组首地址赋值给指针变量p,即指针变量p指向a数组的第一个元素。如图所示。指针与一维数组在p指向首地址前提下,如依次进行以下操作,指针变量p将不断地指向新的数组元素。(1)p++;则表示p向后移动一个位置,指向a[1](2)p--;则表示p向前移动一个位置,重新指向a[0](3)p=p+3;则表示p向后移动三个位置,指向a[3]指针与一维数组1、指针与一维数组的对应关系
inta[10],*p=a;使p指向a数组的第一个元素a[0]各元素的指针按存储单元递增a[0]a[2]a[4]a[3]a[6]a[7]a[1]a[5]a[8]a[9]memorypp+1p+2p+92、用指针访问数组的一般形式对下标为i的元素访问:
a[i],*(a+i),*(p+i)对a[i]的地址表示:
&a[i],a+i,p+i
指向数组访问数组的两种方式:下标方式,指针方式指针与一维数组(1)下标法(常用,很直观)#include<stdio.h>main(){intscore[10],i;printf("请输入10个学生的成绩\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("输出的10个学生的成绩为\n");for(i=0;i<10;i++)printf("%3d",score[i]);printf("\n");}(2)用数组名计算数组元素的地址。(效率与下标法相同,不常用)#include<stdio.h>main(){intscore[10],i;printf("请输入10个学生的成绩\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("输出的10个学生的成绩为\n");for(i=0;i<10;i++)printf("%3d",*(score+i));printf("\n");}指针与一维数组(3)用指针访问各元素。(常用,效率高)#include<stdio.h>main(){intscore[10],*p,i;printf("请输入10个学生的成绩\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("输出的10个学生的成绩为\n");for(p=score;p<score+10;p++)printf("%3d",*p);printf("\n");}
指针与字符数组
(一)字符串的表示形式1.用字符数组实现#include<stdio.h>main(){charstring[]="IloveChina!";printf("%s\n",string);}2.用字符指针实现
#include<stdio.h>main(){char*string="IloveChina!";printf("%s\n",string);}一、字符串的表现形式
C语言中,有两种方式可以实现字符串:字符数组、字符指针。
指针与字符数组
举例
#include<stdio.h>main(){char*ps="thisisabook";intn=10;ps=ps+n;printf("%s\n",ps);}输出字符串中n个字符后的所有字符。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复制到字符串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是字符数组,则不能用b=a,应用strcpy(b,a)
比较
字符数组与字符串指针变量的区别存放的是首地址字符数组字符串指针变量每个元素放一个字符不能整体赋值chars[6];s=“abcde”;/*不对*/可以整体赋值char*p;
p=“abcde”;chars[6];使用s不能加/减p可以加/减
课后练一练
1、用指针实现:
输入一个字符串,把其中大写字母变成小写字母。2、利用指针来实现:在输入任意的字符串中查找有无‘k’字符。预习下讲指针数组主讲:廖智蓉项目6指针实现学生综合测评成绩管理指针数组指针数组定义格式:类型标识*数组名[数组长度]
功能:指向一维数组的指针变量。
说明:适合于指向若干个字符串,使字符串处理更加方便灵活。
指针数组中每一个元素都是一个指针变量,并且它们具有相同的数据类型。char*p[4];举例
输入一个0至6之间的整数,输出相对应的星期英文单词。#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);}输出结果是什么?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);}如何用函数调用的方式实现两个数的调换?请问下列代码能实现吗?形参不能传递给实参!此方法不能实现两个数的调换!指针变量作函数参数#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);}注意:
指针变量作为函数的参数,从实参向形参的数据传递仍然遵循“单向值传递”的原则,只不过此时传递的是地址.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);}形参是指针就一定能实现两个数的交换吗?请分析下列代码?注意:
指针变量作为函数的参数,只有交换的内容才能实现实参两个数的交换.xyab46tempxy
举一反三
输入a、b、c3个整数,按从大到小顺序输出。#include<stdio.h>voidswap(int*a,int*b){intt;t=*a;*a=*b;*b=t;}
voidmain(){inta,b,c,*p1,*p2,*p3;printf("请输入3个数,以逗号隔开:");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("从大到小的顺序为:");printf("%d,%d,%d\n",a,b,c);}预习下讲指向结构体数组的指针主讲:廖智蓉项目6指针实现学生综合测评成绩管理指向结构体和结构体数组的指针指向结构体一个结构体变量的指针就是该变量在内存中的起始地址。1.指向结构体变量的指针定义和赋值例:structstudentstu1,*sp;sp=&stu1;结构体指针变量定义指向结构体指针变量的赋值指向结构体(2)结构体指针变量引用结构体变量。
(*sp).成员名
或
sp->成员名例如:(*sp).id,(*sp).name,(*sp).avg或sp->avg结构体成员的引用方法:(1)用结构体变量名引用结构体成员。
这种方法我们在前面已经学习过。如:stu1.id,,sut1.sex,stu1.avg等。举例用结构体指针变量引用的方式输出一个学生的信息。#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);}指向结构体数组的指针structstudent{charid[6];charname[10];intm1,m2,m3;floatavg,sum;}stu1[10];//定义结构体数组。
structstudent*sp;//定义结构体类型指针。
sp=stu1;//将结构体数组首地址送给结构体指针。说明:当前sp指针指向数组首地址。
执行sp++后指针指向下一个数组单元;执行sp--后指针指向上一个数组单元。所以使用指针变量可以方便的在结构体数组中移动。举例用结构体指针变量引用的方式输出学生的信息。#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("学号\t姓名\t数学英语
语文
总分
平均分\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); }}
练一练修改错误,带有星号的下一行有错。struct
axy
*a;scanf("%d",&n);for(i=0;i<n;i++);printf(“%f\n”,(a+i)->y;printf(“%f\n”,a[i]->y;
课后练一练
用指针指向结构体数组实现:下列信息输入和输出。学号姓名性别QQ联系电话1701001张颖女7874637137237823341701002李楠男9887773131458479891701003王强男123456713679898035预习下讲指针与二维数组主讲:廖智蓉项目6指针实现学生综合测评成绩管理指针与二维数组二维数组结构设有数组定义为:inta[3][4];则有:
a表示数组在内存中的首地址。
a+i=a[i]=&a[i][0]代表第i行的首地址二维数组结构二维数组的逻辑结构图如下: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]);}输出二维数组有关值举例用指针变量输出二维数组元素。#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");}}指向指针的指针如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。定义格式:类型标识符**指针变量名如:char**p;应用#include<stdio.h>main(){staticchar*name[]={"Illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
char**ps;//定义一个指向字符指针变量的指针变量psinti;printf("inputD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学探究型学习活动设计
- 建筑安装工程承包合同拖欠工程款起诉书(34篇)
- 胃扭转个案护理
- 老年护理临终护理
- 消防知识培训物业
- 手术期护理讲课
- 齿轮传动的失效形式轮齿的折断
- 血友病的查房
- 2024至2030年中国三维编织花纹辊行业投资前景及策略咨询研究报告
- 2024年中国隔膜防爆计量泵市场调查研究报告
- 压力容器生产单位压力容器质量安全日管控、周排查、月调度制度(含表格记录)
- 吸收放散实验课件
- 3.1《让小车运动起来》优质课件
- 新形势下,如何做好一人一事思想政治工作
- 《基于核心素养高中物理实验教学实施素质教育的研究》结题总结报告
- 行政人事部工作分析表
- 英语漫谈胶东海洋文化知到章节答案智慧树2023年威海海洋职业学院
- 航空母舰优秀课件
- 2023年芒果TV春季校园招聘笔试参考题库附带答案详解
- 共享中国知到章节答案智慧树2023年上海工程技术大学
- 中国十大传世名画课件
评论
0/150
提交评论