C语言的指针和结构体

上传人:tian****1990 文档编号:245538915 上传时间:2024-10-09 格式:PPT 页数:39 大小:277KB
返回 下载 相关 举报
C语言的指针和结构体_第1页
第1页 / 共39页
C语言的指针和结构体_第2页
第2页 / 共39页
C语言的指针和结构体_第3页
第3页 / 共39页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C,语言中的指针与结构体,指针,的概念,地址 内容,变量名,int x=20,y=1,z=155;,int*p;,p=,1000 20,x,1002 1 y,1004 155 z,2000 1000,p,2002,指针变量,指针变量,:存放地址的变量,某个,变量,的地址,指向,(,内存单元,),指针变量所指向的变量的类型,int *p;,p,是整型指针,指向整型变量,float*fp;,fp,是浮点型指针,指向浮点型变量,char*cp;,cp,是字符型指针,指向字符型变量,类型名 *,指针变量名,指针声明符,指针变量的定义,取地址运算,(&),和间接访问运算,(*),*,:,间接访问运算符,,访问指针所指向的变量。,*,p,:指针变量,p,所,指向的,变量,。,a,3,&a,p,*,p,如果指针的值是某个变量的地址,通过指针就能,间接访问,那个变量。,&,:,取地址运算符,,给出变量的地址。,int*p,a=3;,p=&a,;,把,a,的地址赋给,p,,即,p,指向,a,/,指针变量的类型和它所指向变量的类型相同,a,3,&a,p,*,p,(1)当,p=&a,后,*,p,与,a,相同,(2),int,*p,;,定义,指针变量,p,*,p,=10;,指针,p,所指,向,的变量,,即,a,,改变变量值,(3),&*,p,与&,a,相同,,是,地址,*&,a,与,a,相同,,是,变量,(4)(*p)+,等价于,a+,将,p,所指,向,的变量值加1,*,p+,等价于,*(,p+),/,先取,*,p,,然后,p,自加,此时,p,不再指向,a,说明,int a=3,*p;,p=,赋值运算,a,3,&a,p1,&a,p2,*p1,*p2,int a=3,*p1,*p2;,p1=,/,把,a,的地址赋给,p1,,即,p1,指向,a,p2=p1;,/p2,也指向,a,/,相同类型的指针才能相互赋值,注意:,指针,变量必须初始化。,void main(),int a=1,b=2,*p1,*p2,*pt,;,p1=p2=&b,;,printf(a=%d,b=%d,*p1=%d,*p2=%dn,a,b,*p1,*p2);,pt=p1,;p1=p2;p2=pt;,printf(“a=%d,b=%d,*p1=%d,*p2=%dn”,a,b,*p1,*p2);,return 0;,p1,b,2,&b,p2,*,p2,a,1,&a,*,p1,pt,b,2,&a,p2,*,p1,a,1,&b,p1,*,p2,pt,&a,a=1;b=2;*p1=1,*p2=2,a=1;b=2;*p1=2,*p2=1,指针,作为函数参数,void swap(int*px,int*py),int t;,t=*px;,*px=*py;,*py=t;,要通过函数调用来改变主调函数中某个变量的值:,(1),在主调函数中,,将该变量的地址或者指向该变量的指针作为实参,(2),在被调函数中,,用指针类型形参接受该变量的地址,(3),在被调函数中,改变形参所指向变量的值,a,b,px,py,1,2,2,1,/,swap(,数组和地址间的关系,int a100,*p;,数组名代表一个地址,它的值是数组首元素的地址(基地址),a+i,是距数组,a,的基地址的第,i,个偏移,3000 a0,地址 内容 数组元素,3002 a1,3198 a99,ai,a,a+1,a+99,a+i,&ai,*,(a+i),sum=0;,for(i=0;i 100;i+),sum=sum+ai ;,*(a+i),下标运算符,的含义,任何由数组下标来实现的操作都能用指针来完成,int a100,*p;,p=a;,或,p=,p,p,+1,p,+99,p,+i,3000 a0,地址 内容 数组元素,3002 a1,3198 a99,ai,a,a+1,a+99,a+i,&ai,ai,a+i,*(a+i),p+i,*(p+i),&pi,pi,p=a;,sum=0;,for(i=0;i 100;i+),sum=sum+pi;,等价,等价,*(p+i),sum=0;,for(p=a;p,”,访问指针指向的结构成员。,p,-,age=26;,当,p=&friend1,时,以下三条语句相同:,friend1.age=26;,(*,p).age,=26;,p-age=26;,结构体指针作为函数参数,当结构指针作为函数的参数时,执行效率高,可以完成比基本类型指针更为复杂的操作。,例:输入,10,个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。,每个学生的记录包括学号、姓名、成绩和等级,要求定义和调用函数,set_grade,根据学生成绩设置等级,并统计不及格人数,等级设置:,A,:,85,100,;,B,:,70,84,;,C,:,60,69,;,D,:,0,59,源程序,#define N 10,struct student,int num;,char name20;,int score;,char grade;,;,int main(void),int count;,struct student,stuN,*ptr;,ptr=stu;,/*,输入 略*,/,count=set_grade(,ptr,);,int set_grade(,struct,student*p,),int i,n=0;,for(i=0;i score=85),p-grade=A;,else if(p-score=70),p-grade=B;,else if(p-score=60),p-grade=C;,else,p-grade=D;,n+;,return n;,调用,set_grade,返回主函数后,主函数中结构体数组,stu,的元素的,grade,成员已经被赋值,.,与结构体变量作为函数参数相比,用结构体指针作为函数参数的效率更高,因而是更好的选择。,多文件结构,工作区,工程,1,工程,2,工程,n,头文件,源文件,例:,VC,中的多文件结构,示例,#include,#include,#include,#include,/,常量定义,#define LIST_INIT_SIZE 100,#define LISTINCREMENT 10,#define OK 1,#define ERROR 0,#define OVERFLOW-2,#define True 1,#define False 0,/,函数返回值类型定义,typedef int Status;,/,表节点数据类型定义,typedef int ElemType;,/,顺序表类型定义,typedef struct,ElemType*elem;,int length;,int listsize;,SqList;,/,顺序表各操作声明,Status InitList_Sq(SqList,Status DetroyList_Sq(SqList,Status ClearList_Sq(SqList,int ListEmpty_Sq(SqList L);,int ListLength_Sq(SqList L);,Status GetElem_Sq(SqList L,int i,ElemType,Status ListInsert_Sq(SqList,Status ListDelete_Sq(SqList,void PrintList_Sq(SqList L);,头文件:,SqList.h,#include SqList.h,/,各操作的实现,Status InitList_Sq(SqList&L),L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType);,if(!L.elem)exit(OVERFLOW);,L.length=0;,L.listsize=LIST_INIT_SIZE;,return OK;,Status DetroyList_Sq(SqList&L),if(L.elem)free(L.elem);,return OK;,Status ClearList_Sq(SqList&L),if(L.elem),L.length=0;,L.listsize=0;,return OK;,源文件:,SqList.cpp,int ListEmpty_Sq(SqList L),return(L.length=0);,int ListLength_Sq(SqList L),return L.length;,Status GetElem_Sq(SqList L,int i,ElemType&e),if(i=L.length),return ERROR;,e=L.elemi-1;,return OK;,Status ListInsert_Sq(SqList&L,int i,ElemType e),ElemType*newbase,*p,*q;,if(iL.length+1),return ERROR;,if(L.length=L.listsize),newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);,if(!newbase)exit(OVERFLOW);,L.elem=newbase;,L.listsize+=LISTINCREMENT;,q=,for(p=p-),*(p+1)=*p;,*q=e;,L.length+;,return OK;,Status ListDelete_Sq(SqList&L,int i,ElemType&e),ElemType*p,*q;,if(iL.length),return ERROR;,p=,e=*p;,q=L.elem+L.length-1;,for(+p;pq;+p),*(p-1)=*p;,L.length-;,return OK;,void PrintList_Sq(SqList L),int i;,if(L.length=0),cout,该表为空,endl;,else,for(i=0;iL.length;i+),coutL.elemi ;,#include SqList.h,void main(),SqList L;,int i,num;,cout,创建顺序表,endl;,if(!InitList_Sq(L),cout,表创建失败,;/,创建空顺序表,L,else,/,产生各节点,srand(time(NULL);,for(i=0;i10;i+),/,产生,10,个整数,插入顺序表表尾,num=rand()%100;,ListInsert_Sq(L,i+1,(ElemType)num);,源文件:,SqDemo.cpp,(,包含主函数,main(),/,输出原始顺序表的各个值,cout,生成的原始表为:,;,PrintList_Sq(L);,/,输出第,2,个节点的数据值,GetElem_Sq(L,2,num);,coutendl,第,2,个元素值为:,numendl;,/,删除第,2,个节点,ListDelete_Sq(L,2,num);,/,输出修改后的顺序表的各个值,cout,修改后的表为:,;,PrintList_Sq(L);,coutendl;,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!