C语言程序设计案例教程(四)133_第1页
C语言程序设计案例教程(四)133_第2页
C语言程序设计案例教程(四)133_第3页
C语言程序设计案例教程(四)133_第4页
C语言程序设计案例教程(四)133_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

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

文档简介

Date:03May2023C语言程序设计案例教程(四)Date:03May2023第五章C语言程序设计常用算法——冒泡排序授课要点冒泡排序的思想及实现排序算法的应用假设您是一位营养师,有顾客向您索取一份减肥菜谱。前提条件:您熟悉各种食物的热量问题:保持身材之道列出各种食物的热量对各种食物的热量进行排序选择热量低的食物问题分析问题解决——冒泡排序排序过程〔假设元素存放在a[0]-a[n-1]中,按递减排序〕:〔1〕比较第一个数与第二个数,假设为逆序a[0]<a[1],那么交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最小的数被安置在最后一个元素位置上〔2〕对前n-1个数进行第二趟冒泡排序,结果使次小的数被安置在第n-1个元素位置〔3〕重复上述过程,共经过n-1趟冒泡排序后,排序结束冒泡排序算法过程:采用两重计数型循环:步骤1: 将待排序的数据放入数组中;步骤2: 置i为0;步骤3: 让j从0到4-i,比较a[j]与a[j+1], 如果a[j]>=a[j+1],位置不动; 如果a[j]<a[j+1],位置交换,即 temp=a[j];a[i]=a[j+1];a[j+1]=temp; 步骤3结束后a[5-i]中的数为最小的数步骤4: 让i=i+1;只要i<=4就返回步骤3, 将a[5-i]的值排好。当i==5时执行步骤5步骤5: 输出排序结果冒泡排序算法分析:#include<stdio.h>voidmain() /*主函数*/{inti,j,temp,a[6]; /*整型变量*/ for(i=0;i<=5;i++) /*键入6个数,放入a数组中*/ { printf(“请输入食物的热量a[%d]=",i);/*提示*/ scanf("%d",&a[i]); /*用键盘输入整数赋给a[i]*/ } for(i=0;i<=4;i++) /*冒泡排序,外层循环*/ for(j=0;j<=4-i;j++) /*内层循环*/ { /*循环体,开始*/ if(a[j]<a[j+1]) /*如果a[i]>a[i+1]*/ { temp=a[j]; /*让a[i]与a[i+1]交换*/ a[j]=a[j+1]; a[j+1]=temp; } } /*循环体结束*/ printf("食物按热量从高到低的顺序显示为:\n"); for(i=0;i<=5;i++) /*输出排序结果*/ printf("%d\n",a[i]); /*格式输出a[i]*/ }假设将题目改为按从小到大的顺序输出,如何修改程序?假设排序的个数由用户指定,如何修改程序?小组讨论并总结在数组排序的根底上,进一步将一个数据插入一个有序数组中。学生进阶练习

a1a2

…ai-1ai

…ana1a2

…ai-1

…ai

xan数组中的元素增加1个问题分析提示数据初始化〔输入、排序〕输入待插入数据找到待插入位置将待插入位置空出插入数据输出结果#include<stdio.h>voidmain() /*主函数*/{inti,j,temp,a[6],x; /*定义整型变量*/ for(i=0;i<=5;i++) /*键入6个数,放入a数组中*/ { printf("请输入待排序的数a[%d]=",i); /*提示*/ scanf("%d",&a[i]); /*用键盘输入整数赋给a[i]*/ } for(i=0;i<=4;i++) /*冒泡排序,外层循环*/ for(j=0;j<=4-i;j++)/*内层循环*/ { /*循环体,开始*/ if(a[j]>a[j+1])/*如果a[i]>a[i+1]*/ { temp=a[j]; /*让a[i]与a[i+1]交换*/ a[j]=a[j+1]; a[j+1]=temp; } } /*循环体结束*/ for(i=0;i<=5;i++) /*输出排序结果*/ printf("%d\n",a[i]); /*格式输出a[i]*/ i=0; printf("请输入您要插入的整数:\n");/*提示*/ scanf("%d",&x); /*用键盘输入要插入的整数赋给x*/ while(i<=6&&x>a[i]) /*循环查找插入的位置*/ i++; for(j=5;j>=i;j--) /*循环实现元素后移*/ a[j+1]=a[j]; a[i]=x; /*插入元素x*/ printf("插入后的序列是:\n"); for(i=0;i<=6;i++) /*输出排序结果*/ printf("%d\n",a[i]); /*格式输出a[i]*/}实现寻找你身边的一个实际问题,编写解决问题的程序,用到冒泡排序。例如:有N个国家参加运动会,从键盘输入代表各国运动队的国名〔国名用英文名〕和出场秩序名单,然后按出场名次从小到大的顺序输出各运动队的国名。学以致用完成“学生成绩管理系统〞的“排序〞功能。按成绩从高到低的顺序显示按学号从小到大的顺序显示完成“学生成绩管理系统〞的“信息插入〞功能作业——每人必做学以致用:到网上搜索资料,找出日常生活中会用到排序的例子,用C语言实现。例如,可以搜索一些大学图书馆的藏书量,然后按照递增或递减的顺序输出

作业——小组必做Date:03五月2023第四章模块化程序设计授课要点数组元素作函数参数数组名作函数参数432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b为有10个元素的整型数组比较两数组对应元素变量n,m,k记录a[i]>b[i],a[i]==b[i],a[i]<b[i]的个数最后假设n>k,认为数组a>b假设n<k,认为数组a<b假设n==k,认为数组a==b数组元素作函数参数和普通变量作函数参数效果和用法一样

问题1:假设有两个整型数组,试编程实现数组间关系〔大于、等于或小于〕的输出。#include<stdio.h>main(){inta[10],b[10],i,n=0,m=0,k=0;printf("Enterarraya:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);printf("Enterarrayb:\n");for(i=0;i<10;i++) scanf("%d",&b[i]);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}

/*Output*/}intlarge(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}问题1解决方案:模仿练习1、把8、9、5、8、6、4、2、8和9、6、2、3、6、2、1、3这两组数保存在两个一维数组中〔主函数实现〕,再把两个数组对应元素的值相减后〔自定义函数实现〕显示出来〔主函数实现〕。2、实现两个整型变量的值的互换。〔假设两个整型变量是一个长度为2的整型数组的元素〕模仿1答案#include<stdio.h>intsub(intx,inty);voidmain(){ inta[]={8,9,5,8,6,4,2,8}; intb[]={9,6,2,3,6,2,1,3}; intresult,i; for(i=0;i<8;i++) { result=sub(a[i],b[i]); printf("%d\n",result); }}intsub(intx,inty){ returnx-y;}#include<stdio.h>voidswap2(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};

swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值传递模仿2答案12a调用前FFAAFFAE12x调用时yFF01FAAC21x交换yFF01FAAC12a返回FFAAFFAE授课要点数组元素作函数参数数组名作函数参数模仿1改进#include<stdio.h>voidsub(intx[],inty[],intn);voidmain(){ inta[]={8,9,5,8,6,4,2,8}; intb[]={9,6,2,3,6,2,1,3}; sub(a,b,8);}voidsub(intx[],inty[],intn){ inti,result; for(i=0;i<n;i++) { result=x[i]-y[i]; printf("%d\n",result); }}问题2:定义一个函数,求全班学生的某门课程总分,并将总分返回到主函数中输出。问题2解决---自定义函数求总分intsum(int

stu[

],intn){inti;inttotal=0;for(i=0;i<n;i++)total+=stu[i];returntotal;}形参用数组定义,intstu[]n为数组长度

#include<stdio.h>

floatsum(intstu[],intn);voidmain(){intscore[10],i;inttotal;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%d",&score[i]);total=sum(score,10);printf(“sumis:%d",total);}intsum(int

stu[],intn){inti;inttotal=0;for(i=0;i<n;i++)total+=stu[i];returntotal;}实参用数组名..2109score562312….….88stu问题2解决形参用数组定义,intstu[]数组名作函数参数总结地址传递在主调函数与被调函数分别定义数组,且类型应一致,实参用数组名,形参用数组定义形参、实参数组名是地址变量模仿练习1、实现两个整型变量的值的互换。〔假设两个整型变量是一个长度为2的整型数组的元素〕2、在主函数输入8个整数保存到数组中,自定义函数对数组元素排序,并在主函数中将排序后的数组输出。3、在主函数输入10个整数保存到数组中,分别定义三个函数求和、平均值和最大值并返回到主函数输出。12a调用前12ax调用21ax交换21a返回#include<stdio.h>voidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};

swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}地址传递模仿1答案小组讨论并总结数组元素作函数参数时,实参和形参间的传递方式是什么?数组名作函数参数时,实参和形参的写法有什么不同?数组元素作函数参数是,实参与形参间发生值传递。结论1:数组名作函数参数时,实参和形参间发生地址传递;在主调函数与被调函数分别定义数组,且类型应一致;形参数组大小(多维数组第一维)可不指定,形参数组名表示地址;结论2:学以致用 寻找你身边的一个实际问题,用到数组名作函数参数。例如:定义一个函数,实现10个同学身高的比较,从中找出最高身高,并返回到主函数中输出。作业——每人必做将“学生成绩管理系统〞中的“学生〞变量定义成结构体数组,学生信息的输入、输出代码做出相应的修改。Date:03五月2023第四章模块化程序设计---二维数组授课要点二维数组的定义和引用二维数组的初始化和赋值二维数组的简单应用问题1:有如下表,

在C程序中如何表示和存储24684812161012141813151719假定某班有3名学生期末考试共5门课程,要求输入每名学生各门成绩,计算出每名学生的总分并输出。问题2

课程学生C语言高数英语文化基础体育李军9075819555陈兰6062678778王芳8591988873以上两个例子有什么共同之处?分析:1、每行都是4个整数,类型一致2、每名学生都有5门课程,成绩类型一致问题解决——二维数组如何定义二维数组?如何为数组元素赋值?如何引用数组元素?二维数组的定义和引用二维数组——有两个下标的数组类型说明符数组名[常量表达式1][常量表达式2]例如:inta[4][4];数组元素的存放顺序原因:内存是一维的二维数组:按行序优先行数列数元素个数=行数*列数inta[3][2]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]014523a[0][0]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[3][0]a[3][1]a[3][2]a[3][3]二维数组理解例inta[3][4];20161720181920202120222320089201011201213201415200012002320045200067a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]每个元素a[i]由包含4个元素的一维数组组成二维数组a是由3个元素组成a[0]a[1]a[2]行名014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]因此:二维数组中的每一行,相当于一个一维数组。或者说,一维数组是由多个简单变量组成,而二维数组是由多个一维数组组成。二维数组的初始化二维数组元素的初始化分行初始化:

例inta[2][3]={{1,2,3},{4,5,6}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部初始化

例inta[][3]={{1},{4,5}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]100450第一维长度省略初始化

例inta[2][3]={1,2,3,4,5,6};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部初始化例inta[2][3]={1,2,4};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]124000部分初始化

例inta[][3]={1,2,3,4,5};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123450第一维长度省略初始化定义一二维数组,存放下表数据:模仿练习24684812161012141813151719数组的赋值只能对数组元素单独操作,不能对数组整体操作。赋值的两种方式:inta[5][4];赋值运算符如:a[3][0]=8;输入函数如:for(i=0;i<5;i++) for(j=0;j<4;j++) scanf(“%d〞,&a[i][j]);单独为每个元素赋值对数组的整体赋值只能在初始化时进行二维数组的赋值二维数组的遍历数组的遍历一般用二重循环实现注意下标的取值范围,不能越界〔编译系统对下标的越界不做检查〕假定某班有3名学生期末考试共5门课程,要求输入每名学生各门成绩,计算出每名学生的总分并输出。问题2#include<stdio.h>voidmain(){ inta[3][6],i,j; for(i=0;i<3;i++) a[i][5]=0;/*为每位学生的总分赋初值0*/ for(i=0;i<3;i++)/*控制多少学生(多少行)*/ { printf("请输入第%d个学生5门课程成绩:",i+1); for(j=0;j<5;j++)/*控制每个学生的课程(每行的列)*/ {scanf(“%d〞,&a[i][j]);a[i][5]+=a[i][j];}/*输入成绩参加总分*/ } printf("学号总分\n"); for(i=0;i<3;i++) printf(“%3d%6d\n〞,i+1,a[i][5]);/*假设第i个学生的学号为i*/}问题2解决—定义3行6列的二维数组存放学生每门课程成绩和总分,每行的最后一列存放总分学生模仿练习1、定义一个二维数组存放如以下图形,并输出。1234513579543213、某班〔假设有2人〕期中考试3门成绩:(1)从键盘输入每个学生成绩(2)求每个学生的总分和平均分(3)按每个学生的总分求出最高分小组讨论并总结如何保证数组不越界?有二维数组:inta[5][5];

其中a[0]、a[1]、a[2]、a[3]、a[4]表示什么?结论1——保证数组不越界C语言编译系统并不检查数组是否越界。它只给已定义的数组元素分配内存,超过的局部那么依次往后排,至于那些位置的用途是什么,系统是不管的。读出那些单元一般不会出问题,但如果往那里面写入数据会导致不可预料的错误。时刻注意数组的起始元素下标值和最后元素的下标值结论2——二维数组中a[0]、a[1]、a[2]、a[3]、a[4]表示什么?a[0]为二维数组a的第1行起始地址a[1]为二维数组a的第2行起始地址a[2]为二维数组a的第3行起始地址a[3]为二维数组a的第4行起始地址a[4]为二维数组a的第5行起始地址因此:二维数组中的每一行,相当于一个一维数组。或者说,一维数组是由多个简单变量组成,而二维数组是由多个一维数组组成。

学以致用

寻找你身边的一个实际问题,用到二维数组。例如:编写程序实现功能:求一个3×4矩阵的所有靠外侧的元素值之和。设矩阵为:3 8 9 10a=2 5 -3 57 0 -1 4

作业——每人必做将“学生成绩管理系统〞中的“学生〞变量定义成数组,学生信息的输入、输出代码做出相应的修改。Date:03五月2023第四章模块化程序设计授课要点字符数组的定义及初始化字符串的定义及初始化字符串处理函数如何在屏幕上显示如下信息:abcdefghij问题字符数组的定义

char字符数组名称[字符数组的长度] 特点:字符数组的每个存储单元只能存储1个字符。如:charstr[10];那么:数组str中可以存放10个字符。假设存入的字符分别为:’a’、’b’、’c’、’d’、’e’、’f’、’g’、’h’、’i’、’j’那么这组字符在内存的存储可能如下:abcdefghijstr字符数组的初始化 与一维数组的初始化类似,我们也可以在定义字符数组的同时就对它进行赋值,即初始化。如:chars[5]={‘a’,‘b’,‘c’,‘d’,‘e’};那么:数组元素在内存中的存储如下:abcdes数组名s是常量,代表数组所占内存单元的首地址字符串的定义及初始化 字符串是用一对双引号括起来的字符序列。双引号中可以是一个字符,也可以是多个字符。 在C中,没有专门的字符串变量,它只能通过字符数组来进行操作。可用如下形式定义一个字符串charstr1[10]=“hellotom〞;字符串在内存中的表示 在C中,每个字符串的末尾系统都会自动加上一个特殊字符‘\0’,以方便进行字符串处理。 ‘\0’是字符串结束标记。如上面定义的字符串charstr[12]=“hellotom〞;在内存中的存储如下:hellotom\0str数组名str是常量,代表数组所占内存单元的首地址字符串的输入与输出1、用printf和scanf来进行输入输出#include<stdio.h>main { myfunc();}myfunc(){charstr[100];//定义一个较大的字符数组用来存储字符串

printf("Inputastring:\n");scanf("%s",str);printf("thestringis:\n");printf("%s",str);}字符串的输入与输出2、用gets和puts来进行输入输出#include<stdio.h>main { myfunc();}myfunc(){charstr[100];//定义一个较大的字符数组用来存储字符串

printf("Inputastring:\n");

gets(str);printf("thestringis:\n");

puts(str);}小组讨论并总结gets和scanf输入字符串时的差异。puts和printf输出字符串的差异。gets和scanf输入字符串时的差异gets是能够接收到空格的字符串,到回车字符为止;scanf不能接收空格,一般遇到空格或回车即停止。如在执行时输入字符串“IwanttolearnClanguagewell.〞用gets可以接收所有字符串,用scanf只能接收I。故:对于字符串的处理常用字符串处理函数来操作。puts和printf输出字符串的差异puts在输出字符串时,遇到’\0’会自动终止输出,并且将’\0’转换为’\n’来输出。而printf在输出字符串时,遇到’\0’只是终止输出,并不会将’\0’转换为’\n’来输出。观察以下代码的运行结果:voidmain(){ chars[]="hello!"; puts(s); puts(s); printf("%s",s); printf("%s",s);}字符串处理函数1、输入函数:gets语法形式:gets(str);/*str为已定义好的字符数组*/功能:从键盘接收一个字符串,存储到数组str中,并在末尾自动添加上字符串结束标志’\0’。2、输出函数:puts语法形式:puts(str);/*str为已定义好的字符数组*/功能:输出字符串str的内容,并将字符串结束标志’\0’转换成’\n’输出。模仿练习从键盘输入一个字符串,输出该字符串。字符串处理函数3、求字符串长度函数:strlen语法形式:strlen(str);/*str为已定义好的字符数组*/功能:求字符串str的有效元素的个数,不包括’\0’在内。如:charstr[100]=“study〞;intlength; length=strlen(str); printf(“%d〞,length);那么输出为:5要注意字符串的长度与数组的长度的区别模仿练习从键盘输入一个字符串,求该字符串的长度。字符串处理函数4、字符串连接函数:strcat语法形式:strcat(strSource,strTarget);/*strSource和strTarget为已定义好的两个字符数组*/功能:将字符串strTarget连接到strSource字符串的尾部,并在新串末尾自动添加’\0’。如:charstrSource[100]=“study〞;charstrTarget[20]=“CLanguage〞; strcat(strSource,strTarget); puts(strSource);那么输出为:studyCLanguage模仿练习从键盘输入两个字符串保存到数组a、b中,将字符串b连接到字符串a的末尾。然后输出连接后的字符串。字符串处理函数5、字符串拷贝函数:strcpy语法形式:strcpy(strSource,strTarget);//strSource和strTarget为已定义好的两个字符数组功能:将字符串strTarget拷贝到strSource字符串中。如:charstrSource[100]=“study〞;charstrTarget[20]=“CLanguage〞; strcpy(strSource,strTarget); puts(strSource);那么输出为:CLanguage模仿练习从键盘输入一个字符串保存到数组a中,定义字符串b,其值与字符串a相同。然后输出a、b两个字符串。字符串处理函数6、字符串比较函数:strcmp语法形式:strcmp(str1,str2);/*str1和str2为已定义好的两个字符数组*/功能:将str1与str2进行比较,假设str1大于str2,那么返回正值,假设str1与str2相等,那么返回0,假设str1小于str2,那么返回负值。如:charstr1[20]=“study〞;charstr2[20]=“student〞; intresult; result=strcmp(str1,str2); printf(“result=%d〞,result);那么输出为:20模仿练习从键盘输入两个字符串保存到数组a、b中,比较这两个字符串的大小。 如果a>b,显示“a大于b〞 如果a<b,显示“a小于b〞 如果a=b,显示“a等于b〞进阶训练不使用系统提供的函数实现以下功能。1、从键盘输入一个字符串,求该字符串的长度。2、从键盘输入两个字符串保存到数组a、b中,将字符串b连接到字符串a的末尾。然后输出连接后的字符串。3、从键盘输入一个字符串保存到数组a中,定义字符串b,其值与字符串a相同。然后输出a、b两个字符串。学以致用 寻找你身边的一个实际问题,编写解决问题的程序,用到字符串函数。 例如:网站的登录系统,密码的长度是有限制的,可以通过字符串处理函数判断用户输入的密码是否在有效长度之内。Date:03五月2023第六章指针指针根底本章知识点指针的概念指针变量指针与数组授课要点指针变量的定义及使用变量的地址和指针结构体与指针问题1变量有三要素:变量名、变量值、变量地址。通过变量名,可以访问变量值,如果想访问该变量的地址呢?变量的地址存放在哪里?程序中:shorti;

floatk;

内存中每个存储单元都有一个编号-----地址…...…...2000200120022005内存02003ik编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象认识指针指针的概念变量的地址:变量对应存储单元的首地址;指针:即变量的地址;指针变量:专门存放变量地址的变量即指针变量。变量地址与指针…...2000200420062005短整型变量i102001200220032000

变量的内容

变量的地址指针指针变量地址变量i_pointer指针变量指针变量…...…...2000200420062005短整型变量i102001200220032000指针

变量的内容变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量变量i_pointer指针变量的定义类型说明符*变量名;例如:int*p1;

对指针变量的定义包括三个内容:(1)指针类型说明(*),即定义变量为一个指针变量;(2)指针变量名(p1);(3)变量值(指针)所指向的变量的数据类型(int)。学生模仿练习定义整型指针变量;定义单精度浮点型指针变量;定义双精度浮点型指针变量;定义字符型指针变量;问题2定义指针变量之后,如何访问该指针变量的值呢?比照思考:定义整型变量之后,如何访问该整型变量的值呢?结论:访问变量值之前,必须先赋值。例1:如何给指针变量值?方式一:初始化intx=3;int*p=&x; 方式二:赋值语句intx=3;int*p;p=&x;3变量x2000p&xp例2:将例1补充成完整的程序。观察指针变量的引用。voidmain(){ intx=3; int*p=&x; printf("变量值:x=%d,p=%d\n",x,p); printf("变量地址:x=%x,p=%x\n",&x,p); printf("间接访问变量值:*p=%d\n",x,*p);}问题3:找人因为有门牌号,我们找人就有两种方法:直接找:由物业管理员直接带到朋友家里间接找:先通过物业管理员了解朋友的门牌号,然后自己找变量有地址,也有指向该地址的指针变量。因此,变量的访问也有两种方式直接访问:按照变量的地址进行存取间接访问:先访问变量的地址,得到变量的地址值以后再去访问该变量变量的访问方式例

i=20;-----直接访问指针变量…...…...2000200420062005整型变量x10变量p20012002200320003例*i_pointer=20;-----间接访问20按变量地址存取变量值通过存放变量地址的变量去访问变量i_pointer&i&(*i_pointer)i*i_pointer*(&i)i_pointer

=

&i

=

&(*i_pointer)i=*i_pointer=*(&i)指针变量的引用&和*运算符*——指针运算符(间接访问运算符),取指针所指向的变量的内容&——取地址运算符,取变量的地址3变量x2000p*px*p&xpx=3*p=3例3:利用指针进行输入输出 inta; int*p; /*定义指针变量*/ scanf(“%d〞,&a); /*输入a的值*/ p=&a; /*将变量a的地址赋给指针变量p*/ printf(“%d〞,*p); /*输出p的内容*/ab520002002......3000p&a学生模仿练习分别定义浮点数、字符型变量及其指针,并采用指针进行输入输出使用指针变量定义指针变量时应初始化或赋空值在C语言中用来表示一个空值是使用NULL,它是ASCII码值中的第一个字符,所以以下几公式等价。P=NULL;P=’\0’;或者p=0;指针变量作为函数参数——地址传递特点:共享内存,“双向〞传递void

swap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf("%d,%d",&a,&b);swap(a,b);printf("\n%d,%d\n",a,b);}例在内存中交换两个数值传递…...…...20002008200A2002200420065变量a变量b(main)9运行结果:5,9voidswap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}…...20002008200A200220042006200C200E2010...59整型变量a整型变量b(main)指针pointer_1指针pointer_22000200259例在内存中交换两个数运行结果:9,5地址传递授课要点指针变量的定义及使用变量的地址和指针结构体与指针定义指向结构体的指针定义形式:struct结构体名*结构体指针名;例:structstudent*p;存放结构体变量在内存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;};structstudentstu;structstudent*p=&stu;或:structstudent*p;p=(structstudent*)malloc(sizeof(structstudent))通过指针引用成员变量例intn;int*p=&n;

*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101p->num=101结构体指针名->成员名结构体变量名.成员名(*结构体指针名).成员名小组讨论并总结指针定义后为什么必须要赋值才能使用为什么指向变量的指针必须同变量的类型一致int*p;与*p=10中的*有什么区别使用指针的意义结论1——指针定义后为什么必须要赋值才能使用?指针如果没有赋值,那么指向一个任意的地址,如果使用没有初始化的指针,很危险,会发生一些不可预料的后果。结论2——为什么指向变量的指针必须同变量的类型一致?指针变量用来存放地址,使用前要进行初始化,因此要知道其存放什么类型的地址。一个指针必须指向某一个确定的数据类型定义的变量,而不能随便更改一个指针变量所指向的数据类型。具体地说,一个整型指针变量只能指向一个整型变量,一个实型指针只能指向一个实型变量,更不能定义一个万能型的指针变量〔void〕既可以指向一种数据类型,又可以指向另一种数据类型结论3——int*p;与*p=10中的*有什么区别?int*p中的*表示定义指针变量p*p=10中的*表示访问指针变量p指向地址处存放的值结论3——使用指针的意义使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值作业——每人必做1.从键盘输入5个整数到动态内存区域,求出其中偶数之和。2.定义一个指向“学生〞结构体的指针,通过函数malloc()为一个学生的信息分配空间,通过指针为学号、姓名、4门成绩赋值并输出。Date:03五月2023第六章指针---指针与数组授课要点指向数组元素的指针变量指针的运算用指针表示数组元素引入:数组和指针的关系数组名是表示数组首地址的地址常量指针变量是存放变量地址的变量指向数组元素的指针变量例intarray[10];int*p;

p=&array[0];//p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指针p&array[0]p授课要点指向数组元素的指针变量指针的运算用指针表示数组元素指针的运算指针变量的赋值运算p=&a;(将变量a地址p)p=array;(将数组array首地址p)p=&array[i];(将数组元素地址p)p1=p2;(指针变量p2值p1)不能把一个整数p,也不能把p的值整型变量如

inti,*p;p=1000;()i=p;()指针的算术运算指针的算术运算:pi(i为整型数)p++,p--,p+i,p-i,p+=i,p-=i等假设p1与p2指向同一数组,p1-p2=两指针间元素个数(p1-p2)/dp1+p2无意义指针的算术运算例p指向shortint型数组,且p=&a[0];那么p+1指向a[1]a[0]a[1]a[2

温馨提示

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

评论

0/150

提交评论