C语言程序设计 课件 第8章-指针_第1页
C语言程序设计 课件 第8章-指针_第2页
C语言程序设计 课件 第8章-指针_第3页
C语言程序设计 课件 第8章-指针_第4页
C语言程序设计 课件 第8章-指针_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章指针理解指针和指针变量的概念掌握指针的使用方法及规范掌握使用指针和结构体构建复杂的数据类型本章目标例子1:分别输出不同类型数据在内存中的地址。8.1变量与地址,不是一回事 intmax(inta,intb){ returna>b?a:b; } intmain(){ charch='a'; intnum=97; charcCName[50]; printf("ch的地址:%p\n",&ch); printf("num的地址:%p\n",&num); printf("cCName数组的地址%p\n",cCName); printf("max函数的地址:%p\n",max); return0; }预备知识:内存管理8.1输出地址类型数据

内存假设:32位系统平台,虚拟存储空间为4GB地址:字节编号byte:字节,8个二进制位预备知识:地址的获取和输出8.1输出地址类型数据 printf("ch的地址:%p\n",&ch); printf("num的地址:%p\n",&num); printf("cCName数组的地址%p\n",cCName); printf("max函数的地址:%p\n",max);&:取地址运算符,获取变量的地址%p:输出地址型数据请思考:是否可以使用%x来代替%p,它们有什么区别?指针的概念8.1输出地址类型数据指针的两个要素值类型内存地址数据类型指针的概念8.1输出地址类型数据变量”地址”和”内容”i的地址i的内容scanf(“%d%d”,&i,&j);是如何访问变量i和j的?8.2换个方式用变量指针引用法输入输出中国人口和面积。 #include"stdio.h" intmain(){ doubledPopulation; doubledTerritorialArea; double*pP,*pTA;//定义指针变量 pP=&dPopulation;//pP指向变量dPopulation pTA=&dTerritorialArea;//pTA指向变量dTerritorialArea printf("请输入中国人口(/亿)\n"); scanf("%lf",pP);//使用指针变量pP输入人口 printf("请输入中国面积(/万平方公里)\n"); scanf("%lf",pTA);//使用指针变量pTA输入面积 //指针变量*pP,*pTA引用dPopulation和dTerritorialArea printf("中国人口数量:%lf亿\n国土面积:%lf万平方公里\n",*pP,*pTA); return0; }8.2使用指针输入输出中国的人口和面积如何定义指针变量类型名*指针变量名;例如:int*pointer_i;//定义一个整型指针变量float*pointer_j;//定义一个浮点型指针变量8.2使用指针输入输出中国的人口和面积如何使用指针变量例如:pointer_i=&i;//i的地址赋值给pointer_ipointer_j=&j;//j的地址赋值给pointer_j变量i的地址变量j的地址变量pointer_i的地址变量pointer_j的地址8.2使用指针输入输出中国的人口和面积如何使用指针变量 #include"stdio.h" intmain(){ intnum=97; int*pointer_num=NULL; pointer_num=# printf("pointer_num的地址:%p\n",&pointer_num); printf("pointer_num的值为:%p\n",pointer_num); printf("num的地址:%p\n",&num); return0; }输出地址8.2使用指针输入输出中国的人口和面积如何使用指针变量 #include"stdio.h" intmain(){ intnum=0; int*pointer_num; pointer_num=#

scanf(“%d”,pointer_num); printf("pointer_num的值为:%p\n",pointer_num); printf("pointer_num所指向的变量值:%d\n",*pointer_num); printf("num的值:%d\n",num); return0;10

}输出地址和值为什么上面代码的scanf函数中pointer_num前不加&?8.2使用指针输入输出中国的人口和面积如何使用指针变量 #include"stdio.h" intmain(){

int*pointer_num;

scanf("%d",pointer_num); printf("%d\n",*pointer_num); return0; }野指针问题解决野指针确定的地址NULL指针8.2使用指针输入输出中国的人口和面积使用指针变量交换变量的值1 #include"stdio.h" intmain(){ inta=97,b=98;//定义两个变量 int*pointer_a=&a,*pointer_b=&b,*pointer_t=NULL;//定义三个指针 //交换指针变量的值 pointer_t=pointer_a; pointer_a=pointer_b; pointer_b=pointer_t; printf("a的值为:%d,b的值为:%d\n",a,b);//输出两个变量的值 return0; }代码1-4哪个能成功?8.2使用指针输入输出中国的人口和面积使用指针变量交换变量的值2 #include"stdio.h" intmain(){ inta=97,b=98;//定义两个变量 int*pointer_a=&a,*pointer_b=&b;//定义两个指针 int*pointer_t=NULL;//定义一个指针 //交换指针变量的值 *pointer_t=*pointer_a; *pointer_a=*pointer_b; *pointer_b=*pointer_t; printf("a的值为:%d,b的值为:%d\n",a,b);//输出两个变量的值 return0; }代码1-4哪个能成功?8.2使用指针输入输出中国的人口和面积使用指针变量交换变量的值3 #include"stdio.h" intmain(){ inta=97,b=98,t=0;//定义两个变量 int*pointer_a=&a,*pointer_b=&b,*pointer_t=&t;//定义三个指针 //交换指针变量的值 *pointer_t=*pointer_a; *pointer_a=*pointer_b; *pointer_b=*pointer_t; printf("a的值为:%d,b的值为:%d\n",a,b);//输出两个变量的值 return0; }代码1-4哪个能成功?8.2使用指针输入输出中国的人口和面积使用指针变量交换变量的值4 #include"stdio.h" intmain(){ inta=97,b=98,t=0;//定义两个变量 int*pointer_a=&a,*pointer_b=&b;//定义两个指针 //交换指针变量的值 t=*pointer_a; *pointer_a=*pointer_b; *pointer_b=t; printf("a的值为:%d,b的值为:%d\n",a,b);//输出两个变量的值 return0; }代码1-4哪个能成功?8.3指针与数组查询上合组织(SCO)成员国信息#include"stdio.h"#include"string.h"intmain(){char*cSCO[8]={"China","Russia","Tajikistan","Kyrgyzstan","Uzbekistan","India","Pakistan","Kazakhstan"};doubledPopulation[8]={14.4349,1.44,0.098,0.06362,0.347,13.8,2.25,0.1839};doubledTerritorialArea[8]={960,1709.82,14.31,19.99,44.89,298.0,79.6,272.9};charcSearch[50];double*pP,*pTA;inti,j;pP=dPopulation;pTA=dTerritorialArea;printf("请输入待查询的国家名\n");gets(cSearch);for(i=0;i<8;i++){ if(strcmp(cSCO[i],cSearch)==0){ printf("国家:");puts(cSearch);printf(“人口:%lf亿\n国土面积:%lf万

平方公里\n",*(pP+i),*(pTA+i));break; }}if(i==8)printf("国家名错误!\n");return0;}8.3指针与数组使用指针访问数组如何通过指向数组的指针变量访问数组元素?inta[10]={0};int*pa;pa=&a[0];pa=a;*pa,*(pa+i),*pa++pa[i]指针访问数组涉及的三个问题:定义什么类型的指针变量?指针变量如何指向数组?8.3指针与数组使用指针访问数组#include"stdio.h" intmain(){ inta[10]={0},i=0; int*pa=NULL; pa=a; printf("请输入10个整数:\n"); for(;i<10;i++){ scanf("%d",pa+i); } printf("10个数组元素的值分别为:\n"); for(i=0;i<10;i++){ printf("%3d",*(pa+i)); } printf("\n"); return0; }请尝试修改程序,分别使用*pa,*(pa+i),*pa++,pa[i]8.3指针与数组指针与字符串字符指针变量的定义:char*str="您好!";等价于:char*str;str="您好!";例: #include"stdio.h" intmain(){ char*str="SCO"; puts(str); return0; }字符指针变量和字符数组的异同。8.3指针与数组指针数组例: #include"stdio.h" intmain(){ char*cSCO[8]={"China","Russia","Kazakhstan", "Kyrgyzstan","Tajikistan", "Uzbekistan","India","Pakistan"}; for(inti=0;i<8;i++){ printf("%s\n",cSCO[i]); } }如何输出排序后的结果。8.4函数中的指针指针变量作参数例: #include"stdio.h" intmain(){ voidexchange(int*p1,int*p2); inta=97,b=98,t=0; int*pointer_a=&a,*pointer_b=&b; //交换指针变量的值 exchange(pointer_a,pointer_b); printf("a的值为:%d,b的值为:%d\n",a,b); return0; } voidexchange(int*p1,int*p2){ intt=0; t=*p1; *p1=*p2; *p2=t; }8.4函数中的指针指针数组作参数#include"stdio.h"#include"string.h"intmain(){

voidsort(char*tcSCO[]);char*cSCO[8]={"China","Russia","Tajikistan","Kyrgyzstan","Uzbekistan","India","Pakistan","Kazakhstan"};inti=0;sort(cSCO);//数组名做函数的实参for(i=0;i<8;i++){printf("%d:%s\n",i+1,cSCO[i]);}}voidsort(char*tcSCO[]){ inti=0,j=0,t=0; char*temp=NULL; for(;i<7;i++){ t=i; for(j=i+1;j<8;j++){ if(strcmp(tcSCO[t],tcSCO[j])>0){ t=j; } } if(t!=i){ temp=tcSCO[i]; tcSCO[i]=tcSCO[t]; tcSCO[t]=temp; } } }8.4函数中的指针返回值为指针#include"stdio.h"intmain(){int*max(int*p1,int*p2);inta=0,b=0;int*pa=&a,*pb=&b,*p=NULL;scanf("%d%d",pa,pb);p=max(pa,pb);printf("%disbiggerone\n",*p);return0;}int*max(int*p1,int*p2){ if(*p1>*p2) returnp1; else returnp2;}8.4函数中的指针指向函数的指针类型名(*指针变量名)(函数参数列表)#include"stdio.h"intmain(){int*max(int*p1,int*p2);inta=0,b=0;int*pa=&a,*pb=&b,*p=NULL;int*(*pmax)(int*,int*)=NULL;scanf("%d%d",pa,pb);pmax=max;p=(*pmax)(pa,pb);pmax=add;printf("%disbiggerone\n",*p);p=(*pmax)(pa,pb);printf("%disbiggerone\n",*p);return0;}int*max(int*p1,int*p2){if(*p1>*p2)returnp1;elsereturnp2;}int*add(int*p1,int*p2){intt,*p=&t;t=*p1+*p2;returnp;}8.5结构体指针使用结构体类型的指针#include"stdio.h"#include"string.h"structSCO{charcCName[50];doubledPopulation;doubledTerritorialArea;};structSCO*search(structSCO*pCountry,char*pCName){inti;for(i=0;i<8;i++){if(strcmp((pCountry+i)->cCName,pCName)==0){returnpCountry+i;} }returnNULL;}intmain(){structSCOcountry[8]={{"China",14.4349,960},{"Russia",1.44,1709.82},{"Tajikistan",0.098,14.31},{"Kyrgyzstan",0.06362,19.99},{"Uzbekistan",0.347,44.89,{"India",13.8,298.0},

{"Pakistan",2.25,79.6},{"Kazakhstan",0.1839,272.9}};charcSearch[50];structSCO*pCountry=NULL;

//定义结构体SCO类型的指针变量pCountry=country;

//使指针变量指向数组country的首地址printf("请输入待查询的国家名\n");gets(cSearch);if((pCountry=search(country,cSearch))!=NULL)printf("%10s:%7.2lf亿人%7.2lf万平方公里\n",pCountry->cCName,pCountry->dPopulation,pCountry->dTerritorialArea);elseprintf("国家名错误!\n");return0;}8.5结构体指针指向结构体类型数据的指针——定义和使用结构体类型名*指针变量名;例:structSCOcountry={“China”,144349,960};structSCO*pCountry;pCountry=&country;两种引用方式:(*pCountry).cCNamepCountry->cCName8.5结构体指针指向结构体类型数组的指针——定义和使用结构体类型名*指针变量名;例:structSCOcountry[2]={{"China",14.4349,960},{"Russia",1.44,1709.82}structSCO*pm=NULL;pCountry=country;请根据前面所学,思考如何引用数组元素的数据。8.5结构体指针动态内存分配——内存分配方式在静态存储区域分配在栈上分配在堆上分配在程序编译的时候就已经分配好,在程序的整个运行期间都存在。全局变量和static变量栈内存分配运算内置于处理器的指令集中,效率高,容量有限。函数内局部变量动态内存分配malloc()等函数申请任意大小及数量的内存,使用free()函数释放。8.5结构体指针动态内存分配——void指针 #include"stdio.h" intmain(){ void*pv; inta,*pa=&a; char*pc="hello"; pv=pa; printf("pv=%p,p1=%p\n",pv,pa); pv=pc; printf("pv=%p,pc=%p\n",pv,pc); return0; }void*表示“无类型指针”,没有数据类型上的区分。void类型的指针变量可以存储任何类型的指针,但不指向某个类型的数据。请思考printf(“pv=%p,pa=%p\n”,pv,pa);的执行结果。8.5结构体指针动态内存分配——malloc函数例如:用malloc申请一块长度为length的整数类型长度的内存。int*p=(int*)malloc(sizeof(int)*length);函数原型:void*malloc(unsignedintsize)如何使用malloc申请1个SCO类型长度的内存?尝试写出来。功能:在内存的动态存储区中分配一个长度为size的连续空间。8.5结构体指针动态内存分配——calloc函数函数原型:void*calloc(unsignedn,unsignedsize)如何使用calloc申请2个SCO类型长度的内存?尝试写出来。功能:在内存的动态存储区中分配n个长度为size的连续空间。8.5结构体指针动态内存分配——free函数函数原型:voidfree(void*p)功能:释放指针变址p所指向的动态空间。(p应是最近一次调用calloc()或malloc()函数得到的函数返回值)8.5结构体指针使用指针与结构体构建链表——什么是链表单向链表头指针头节点尾节点节点地址8.5结构体指针使用指针与结构体构建链表——构建静态链表#include"stdio.h"intmain(){structSCO*head=NULL,country1={"China",14.4349,960},country2={"Uzbekistan",0.347,44.89},*pCountry=NULL;head=&country1;country1.next=&country2;country2.next=NULL;pCountry=head;printf("上合组织成员国信息:\n");while(pCountry!=NULL){printf("%10s:%7.3lf亿人%7.2lf万平方公里\n",pCountry->cCName,pCountry->dPopulation,pCountry->dTerritorialArea);pCountry=pC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论