C语言教程-第八讲教学课件_第1页
C语言教程-第八讲教学课件_第2页
C语言教程-第八讲教学课件_第3页
C语言教程-第八讲教学课件_第4页
C语言教程-第八讲教学课件_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第七讲指针2020/12/101本节学习目标指针指针与指针变量指针的声明与使用指针与数组间的关系动态分配内存2020/12/102课前复习一维数组的定义与使用二维数组的定义与使用字符数组的使用2020/12/103课前练习1.若有以下定义语句:floata[11]={0,1,2,3,4,5,6,7,8,9,10}以下描述错误的是()A)a数组在内存中占44个字节.B)a数组的最后一个元素是a[10].C)a数组的第一个元素是a[0]D)以上定义语句给a数组所赋初始值是整数,因此不能正确赋初始值.2020/12/104数据的存储机制内存地址—内存中存储单元的编号。变量地址—系统标识变量在内存中的起始位置。2020/12/105数据的存储机制(续)直接访问#include<stdio.h>voidmain(){ inta,b,sum; printf("请输入a和b的值:"); scanf("%d,%d",&a,&b); sum=a+b; printf("sum=%d\n",sum);}间接访问#include<stdio.h>voidmain(){ inta,b,sum=0; int*p_1,*p_2; printf("请输入a和b的值:"); scanf("%d,%d",&a,&b); p_1=&a; p_2=&b; sum=*p_1+*p_2; printf("sum=%d\n",sum);}2020/12/106指针的功能方便一个函数向另一个函数的过渡。能通过指针的移动来改变指针所指向的数据,不需要去移动变量或数组。可以实现动态内存的更新。2020/12/107指针与指针变量什么是指针?变量的内存地址。指针变量用来存放变量地址的变量。56a变量名1000(内存地址)变量值1000b指针指针变量2020/12/108指针声明格式数据类型*指针变量名;2020/12/109声明注意事项“*”表示声明的指针变量,不是代表指针运算符。“*”前必须指定数据类型(基类型),其主要功能是指指针所指向对象的数据类型。基类型:指针所指向的数据类型。决定了指针每次移动的步长。2020/12/1010指针的赋值与引用指针运算符&——求址运算符(……的地址)*——指针运算符(……地址中的值)2020/12/1011范例inta=10;int*p;p=&a;ap1010100inta=10,int*pp=&a地址地址1001041001042020/12/1012指针赋值2-1通过&运算符为指针赋值 ptr_var=&var;通过另一个指向相同类型数据项的指针变量对指针进行赋值 ptr_var2=ptr_var;2020/12/1013指针赋值2-2通过指针为变量赋值

*ptr_var=10;如果ptr_var指向var,则把10赋给var2020/12/1014课堂练习写出下列计算结果inta=5;/*a的内存地址为3000*/ int*p; p=&a;(1):p; (2)&p (3)*p(4):a (5)&a2020/12/1015课堂练习写出下列计算结果intnum1=2,num2,*pnt;pnt=&num1;num2=*pnt;(1)num1 (2)num2 (3)*pnt

2020/12/1016数组指针与数组的指针变量什么是数组指针?数组在内存中的地址。数组的指针变量存放数组元素地址的变量。2020/12/1017使用指针引用数组元素数组的方法#include<stdio.h>voidmain(){ inta[5]={6,7,8,9,10}; inti; for(i=0;i<5;i++) { printf("a[%d]:%d\n",i,a[i]); }}指针的方法#include<stdio.h>voidmain(){ inta[5]={6,7,8,9,10}; int*p; for(p=a;p<a+5;p++) { printf("%d\n",*p); }}2020/12/1018使用指针变量的注意事项只能进行加法和减法运算 intvar,*ptr_var; ptr_var=&var; ptr_var++;假定var存储在地址1000中,因为整数的长度是2个字节,ptr_var的值将是10022020/12/1019指针运算2-2指针递增时,将指向其类型的下一个元素的内存位置,反之亦然操作意义++ptr_var或ptr_var++指向var后面的下一个整数--ptr_var或ptr_var--指向var前面的整数ptr_var+i指向var后面的第i个整数ptr_var-i指向var前面的第i个整数++(*ptr_var)或(*ptr_var)++将var的值加1*(ptr_var++)取出var后面的下一个整数的值2020/12/1020课堂练习1.若有定义:intx,*pb;则以下正确的赋值表达式是()A)pb=&xB)pb=xC)*pb=&xD)*pb=*x2.若p和q已正确定义,并指向同一连续单元如下,请回答如下问题:a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]

p^q^10203040506070802020/12/1021课堂练习a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]p^q^1.表达式*p-*q的值是___.2.表达式*++p的值是__.指针p是否移动__.3.表达式--*q的值是__.指针q是否移动___.4.表达式*--q的值是__.指针q是否移动___.5.表达式++*p的值是__.指针p是否移动___.6.表达式(*p)--的值是__.指针p是否移动___.7.表达式*q--的值是__.指针q是否移动____,*q的值是_.10203040506070802020/12/1022例题输入两个数,按从大到小的顺序排列。#include<stdio.h>voidmain(){ inta,b; int*p_1,*p_2,*max; p_1=&a;p_2=&b; printf("请输入a和b的数:"); scanf("%d,%d",&a,&b); if(a<b) { max=p_1;p_1=p_2;p_2=max; } printf("%d,%d\n",*p_1,*p_2);}2020/12/1023指针与一维数组3-1数组元素的地址可以用两种方式表示在数组元素前面加“&”符号 &ary[2]数组名+下标 ary+22020/12/1024指针与一维数组3-2#include<stdio.h>voidmain(){staticintary[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i<10;i++){printf(“\ni=%d,ary月[i]=%d,*(ary+i)=%d",i,ary[i],*(ary+i));printf("&ary[i]=%X,ary+i=%X",&ary[i],ary+i);}}值地址2020/12/1025指针与一维数组3-3演示:执行程序,观察并分析输出结果2020/12/1026课堂练习#include<stdio.h>voidmain(){ inta[5]; inti; for(i=0;i<5;i++) { printf("请输入第%d个数:",(i+1)); scanf("%d",&a[i]); }//给数组赋值 printf("\n"); for(i=4;i>=0;i--) { printf("a[%d]=%d\n",i,a[i]); } }2020/12/1027课堂练习#include<stdio.h>voidmain(){ inta[5]; inti; for(i=0;i<5;i++) { printf("请输入第%d个数:",(i+1)); scanf("%d",a+i); }//给数组赋值 printf("\n"); for(i=4;i>=0;i--) { printf("a[%d]=%d\n",i,*(a+i)); } }2020/12/1028课堂练习#include<stdio.h>voidmain(){ inta[5]; inti; int*p; for(i=0;i<5;i++) { printf("请输入第%d个数:",(i+1)); scanf("%d",a+i); }//给数组赋值 printf("\n"); for(p=a+4;p>=a;p--) { printf("a[%d]=%d\n",i,*p); } }2020/12/1029注意事项可以通过指针将一个数组元素赋给另一个数组元素,但不能将一个数组元素的地址赋给另一个数组元素。Ary[2]=ary[3];&ary[2]=&ary[3];2020/12/1030指针与多维数组二维数组可以定义为一个指向一组连续的一维数组的指针 数据类型(*变量名)[常量表达式];pP+1P+2P+3例如:int(*p)[8]2020/12/1031范例#include<stdio.h>voidmain(){ inta[2][3]={1,2,3,4,5,6}; printf("%d\n",*(*(a+1)+2));}2020/12/1032指针与字符串2-1#include<stdio.h>voidmain(){ charary[10]="chinese"; char*p; p=ary+2; printf("%c",*p);}2020/12/1033指针与字符串2-2#include<stdio.h>#include<string.h>voidmain(){ chara,str[81],*ptr; printf("\nEnterasentence:"); gets(str);//输入一个字符串 printf("\nEntercharactertosearchfor:"); a=getche();//输入要查找字符 ptr=strchr(str,a); /*returnpointertochar*/ printf("\nStringstartsataddress:%u",str); printf("\nFirstoccurrenceofthecharacterisat:%u",ptr); printf(“\nPositionoffirstoccurrenceis:%d”,ptr-str);}指针运算Strchr()函数:计算指定字符在字符串中第一次出现的地址。2020/12/1034分配内存2-1malloc()是最常用的函数之一它允许从空闲内存池中分配内存malloc()的参数是代表所需字节数的整数2020/12/1035分配内存2-2#include<stdio.h>#include<malloc.h>voidmain(){

int*p,n,i,j,temp; printf("\nEnternumberofelementsinthearray:"); scanf("%d",&n); p=(int*)malloc(n*sizeof(int)); for(i=0;i<n;++i){ printf("\nEnterelementno.%d:",i+1); scanf("%d",p+i); } for(i=0;i<n-1;++i) for(j=i+1;j<n;++j) if(*(p+i)>*(p+j)){ temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; } for(i=0;i<n;++i) printf("%d\n",*(p+i));}分配内存排序2020/12/1036free()函数3-1使用free()函数释放不再需要的内存

ptr必须是通过malloc()、calloc()或realloc()分配的指针voidfree(void*ptr);2020/12/1037free()函数3-2#include<stdio.h>#include<stdlib.h>intmain(){intnumber;

int*ptr;inti;printf("Howmanyints?");scanf("%d",&number);

ptr=(int*)malloc(number*sizeof(int));if(ptr!=NULL){ for(i=0;i<number;i++) { *(ptr+i)=i; } for(i=number;i>0;i--) { printf("%d\n",*(ptr+(i-1))); }

free(ptr); return0;}else{ printf("\nMemoryallocationfailed.\n"); return1;}}定义分配判断释放2020/12/1038free()函数3-3演示:执行程序,观察并分析输出结果2020/12/1039calloc()函数3-1calloc()与malloc()类似主要的区别是存储在已分配的内存空间中的值默认为零calloc()需要两个参数要分配内存的变量的个数每个变量的大小 void*calloc(size_tnum,size_tsize);2020/12/1040calloc()函数3-2#include<stdio.h>#include<stdlib.h>intmain(){float*calloc1,*calloc2;inti;calloc1=(float*)calloc(3,sizeof(float));calloc2=(float*)calloc(3,sizeof(float));if(calloc1!=NULL&&calloc2!=NULL){for(i=0;i<3;i++){printf("\ncalloc1[%d]holds%05.5f",i,calloc1[i]);printf("\ncalloc2[%d]holds%05.5f",i,*(calloc2+i));}free(calloc1);free(calloc2);return0;}else{printf("Notenoughmemory

温馨提示

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

评论

0/150

提交评论