《C语言宏定义与指针.ppt》由会员分享,可在线阅读,更多相关《C语言宏定义与指针.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第11 11讲讲 宏定义与指针宏定义与指针上周平台编程训练情况练习完成情况:练习完成情况:75757575个同学基本完成练习?个同学基本完成练习?个同学基本完成练习?个同学基本完成练习?7 7 7 7个同学存在折个同学存在折个同学存在折个同学存在折扣或者错误。扣或者错误。扣或者错误。扣或者错误。平台发帖区:平台发帖区:27272727个问题贴,其中我转帖个问题贴,其中我转帖个问题贴,其中我转帖个问题贴,其中我转帖qqqqqqqq问题的问题的问题的问题的聊天记录聊天记录聊天记录聊天记录11111111个帖子,希望大家去浏览帖子。个帖子,希望大家去浏览帖子。个帖子,希望大家去浏览帖子。个帖子,希
2、望大家去浏览帖子。完成标准完成标准完成标准完成标准1 1、提交过、提交过、提交过、提交过2 2、错了订正、错了订正、错了订正、错了订正3 3、反复练习,达到会做、反复练习,达到会做、反复练习,达到会做、反复练习,达到会做4 4、举一反三、举一反三、举一反三、举一反三温故知新温故知新温故知新温故知新 期末考试还有期末考试还有期末考试还有期末考试还有1 1个月,期中考试覆盖内容是重点和基础。个月,期中考试覆盖内容是重点和基础。个月,期中考试覆盖内容是重点和基础。个月,期中考试覆盖内容是重点和基础。1111月月月月1212日课堂练习疑似替做日课堂练习疑似替做日课堂练习疑似替做日课堂练习疑似替做一人身
3、兼三人?一人身兼三人?一人身兼三人?一人身兼三人?课堂练习问题上周平台训练问题1.12生肖问题:字符串输出2.爱因斯坦问题:穷举法3.数的交换问题1 1、最大、最大、最大、最大/最小值最小值最小值最小值2 2、两两交换、两两交换、两两交换、两两交换12生肖问题:字符串输出书144页:字符串输出/输入有两种方法逐字符:需要用到循环,不建议用整个字符串一次性输出/输入:简单简单,建,建,建,建议议用用用用书136页:二维数组float a34;则a0、a1、a2则视作一维数组名char char a1210=A,B;a1210=A,B;printf(%s,printf(%s,a0a0););pri
4、ntf(%c,printf(%c,a00a00););区别区别区别区别爱因斯坦问题穷举法:基本掌握思路:for(i=1;i+)/穷举所有可能,没有设置循环结束条件,因为不知i最大能到多少if(列出题目中的条件)输出答案并break/找到答案就输出,并退出循环书书书书119119页,表达式页,表达式页,表达式页,表达式2 2可省略可省略可省略可省略通过通过通过通过breakbreak退出循环退出循环退出循环退出循环if if需要控制两条语句,因需要控制两条语句,因需要控制两条语句,因需要控制两条语句,因此要此要此要此要 构成复合语句构成复合语句构成复合语句构成复合语句数的交换问题10.7 的问题
5、贴很多:没思路?找不到错误何在?程序阅读1结果?#include#include int main()int main()int a=3,b=4;int a=3,b=4;a=a+b;a=a+b;b=a-b;b=a-b;a=a-b;a=a-b;printf(%d,%dn,a,b);printf(%d,%dn,a,b);不用中间变不用中间变不用中间变不用中间变量的两两交量的两两交量的两两交量的两两交换方法换方法换方法换方法程序阅读2-结果?#includeintmain()inta=3,b=4,t;t=a;a=b;b=t;printf(%d,%dn,a,b);运用中间变量运用中间变量运用中间变量运
6、用中间变量的两两交换方的两两交换方的两两交换方的两两交换方法,法,法,法,经典经典经典经典程序阅读3:max与min作用?#include#includevoid main()void main()int a100,i,min,max,n;int a100,i,min,max,n;scanf(%d,&n);scanf(%d,&n);for(i=0;in;i+)/*for(i=0;in;i+)/*输入输入输入输入n n个数并存到数组个数并存到数组个数并存到数组个数并存到数组*/*/scanf(%d,&ai);scanf(%d,&ai);min=a0;max=a0;min=a0;max=a0;fo
7、r(i=1;in;i+)for(i=1;in;i+)if(aimin)min=ai;if(aimax)max=ai;if(aimax)max=ai;printf(min=%d,max=%dn,min,max);printf(min=%d,max=%dn,min,max);maxmax与与与与minmin记录记录记录记录最大值与最小值最大值与最小值最大值与最小值最大值与最小值平台的平台的平台的平台的6.36.3题题题题平台平台平台平台6.76.7题,题,题,题,maxmax与与与与minmin记录最大值与最记录最大值与最记录最大值与最记录最大值与最小值的位置(小值的位置(小值的位置(小值的位置(
8、下标下标下标下标)平台平台平台平台11.511.5题,题,题,题,maxmax与与与与minmin记录最大值与最小记录最大值与最小记录最大值与最小记录最大值与最小值的位置(值的位置(值的位置(值的位置(指针指针指针指针)10.7 程序挑错1#includevoidmain()inta10,max,min,i,t,n;for(i=0;i=9;i=i+1)scanf(%d,&ai);max=0;min=0;for(i=0;imax)max=i;if(aimin)min=i;t=a9;a9=amax;amax=t;n=a0;a0=amin;amin=n;for(i=0;i=9;i=i+1)print
9、f(%d,ai);printf(n);maxmax与与与与minmin记录最大值与记录最大值与记录最大值与记录最大值与最小值的位置(最小值的位置(最小值的位置(最小值的位置(下标下标下标下标)10.7 程序挑错2#includevoidmain()inta10,i,max,min,k,j;for(k=0;k10;k+)scanf(%d,&ak);amax=a0;amin=a0;for(j=1;j10;j+)if(ajamax)amax=aj;a0=amin;a9=amax;for(i=0;i10;i+)printf(%d,ai);printf(n);maxmax与与与与minmin值不确定,值
10、不确定,值不确定,值不确定,amaxamax、aminamin表示?表示?表示?表示?两两交换?两两交换?两两交换?两两交换?本讲新内容指针与变量指针作函数参数指针与数组宏定义14地址概念与如何表示?地址概念与如何表示?内存区的每一个字内存区的每一个字内存区的每一个字内存区的每一个字节节有一个有一个有一个有一个编编号,号,号,号,这这就是就是就是就是“地址地址地址地址”。C C C C规规定:定:定:定:变变量的地址量的地址量的地址量的地址:可以用取地址运算符可以用取地址运算符可以用取地址运算符可以用取地址运算符&来来来来获获取取取取数数数数组组的地址的地址的地址的地址:可以用可以用可以用可以
11、用数数数数组组名名名名表示表示表示表示函数的地址函数的地址函数的地址函数的地址:可以用函数名表示可以用函数名表示可以用函数名表示可以用函数名表示15int i,j,k;int i,j,k;printf(%d,i);printf(%d,i);scanf(%d,&i);scanf(%d,&i);k=i+j;k=i+j;指针是一种特殊变指针是一种特殊变指针是一种特殊变指针是一种特殊变量,它存放地址。量,它存放地址。量,它存放地址。量,它存放地址。地址2000是变量的指针 变量与指针10.10.1.1 定义一个指针变量定义一个指针变量定义指针变量的一般形式为:数据类型数据类型 *指针变量名;指针变量名
12、;例:例:int *ptr;float *array;char *s1,*s2;在定义指针变量时要注意两点:在定义指针变量时要注意两点:(1)指针变量前面“*”,表示该变量的类型为指针型变量。(2)例:float*pointer_1;(3)指针变量名是pointer_1,而不是*pointer_1。(4)(2)在定义指针变量时必须指定类型。(5)需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的(6)floata;(7)int*pointer_1;(8)pointer_1=&a;18指针的初始化指针的初始化指指针在定在定义后必后必须初始化初始化才能使用;否
13、才能使用;否则,结果不确定。果不确定。指指针初始化的一般格式:初始化的一般格式:数据数据类型型*指指针变量名量名初始地址初始地址值;或或数据数据类型型*指指针变量名;量名;指指针变量名量名=数据数据对象地址;象地址;其中数据其中数据对象地址可以是象地址可以是变量、数量、数组、函数、函数、结构等的地构等的地址。如:址。如:intx=7;int*ptr=&x;/指向指向单个个变量量char*sp;sp=“string”;/指向字符串指向字符串inta5,*ap;ap=a;/指向数指向数组intmax(),(*fp)();fp=max;/指向函数指向函数编程中常用的初始化方法:程中常用的初始化方法:
14、int*ptr=NULL;/初始化初始化为空指空指针19指针与变量的使用指针与变量的使用#include#include void main()void main()int*ptr,x;int*ptr,x;x=7;x=7;ptr=&x;ptr=&x;printf(%d,%dn,printf(%d,%dn,x x,*ptr*ptr););直接用变量名直接用变量名直接用变量名直接用变量名通过指针通过指针通过指针通过指针例例10.2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#includevoidmain()int*1,*2,*,;scanf(,);1;if
15、();printf(=,=,);printf(max=,min=,*1,*2);运行情况如下:运行情况如下:,当输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交换后见图()。10.10.3.3 指针变量作为函数参数指针变量作为函数参数例例10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#includevoidmain()voidswap(int*,int*);int,;int*pointer_,*pointer_;scanf(,);pointer_;pointer_2;if(swap(pointer_,p
16、ointer_2);printf(,);voidswap(int*,int*)inttemp;temp*1;*;*temp;10.10.通过指针引用数组元素通过指针引用数组元素引用一个数组元素,可以用:()()下标法,如形式;下标法,如形式;()()指针法,如指针法,如*()或()或*()()。其中是数组名,是指向数组元素的指针变量,其初值。例例10.5 输出数组中的全部元素。输出数组中的全部元素。假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:(1)下标法。下标法。#includevoid main()int;int;for(;)scanf(,);printf();for(;)p
17、rintf(,);(2)通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#includevoidmain()int;int;for(;)scanf(,);printf();for(;)printf(,*();(3)用指针变量指向数组元素。用指针变量指向数组元素。#includevoidmain()int;int*,;for(;)scanf(,);printf();for(;();)printf(,*);例例10.通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。#includevoidmain()int*,;for(;)scanf(,);print
18、f();for(;,)printf(,*);程序运行情况:程序运行情况:123456789022153234003003625202116318259823728483显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值#includevoidmain()int*,;for(;)scanf(,);printg();p=a;for(;,)printf(,*);宏定义为什么要用宏如何定义#define PI 3.1415926带参数的宏#define PI 3.1415926#define s(r)PI*r*r带参数的宏和函数的区别#define PI 3.1415926#de
19、fine s(r)PI*r*rfloat ss(flaot r)return(PI*r*r);main()int a;scanf(“%d”,&a);printf(”%f”,s(a);printf(”%f”,ss(a);printf(”%f”,s(a+5);printf(”%f”,ss(a+5);文件包含什么是文件包含头文件文件包含的两种形式#include#include”两者的区别P.196本周编程训练 11.1 11.1 寻找做好事的人寻找做好事的人寻找做好事的人寻找做好事的人 11.2 11.2 寻找最大数寻找最大数寻找最大数寻找最大数-指针与变量指针与变量指针与变量指针与变量 11.3
20、 11.3 圆的面积计算圆的面积计算圆的面积计算圆的面积计算-宏定义宏定义宏定义宏定义 11.4 11.4 升序排序升序排序升序排序升序排序-指针作函数形参指针作函数形参指针作函数形参指针作函数形参 11.5 11.5 寻找最大数寻找最大数寻找最大数寻找最大数-指针与数组指针与数组指针与数组指针与数组 11.6 11.6 单词个数统计单词个数统计单词个数统计单词个数统计-数组下标法数组下标法数组下标法数组下标法 11.7 11.7 完全数完全数完全数完全数 11.8 11.8 回文数回文数回文数回文数 11.9 11.9 逆序输出逆序输出逆序输出逆序输出-字符串字符串字符串字符串 11.10
21、11.10 字符串分割字符串分割字符串分割字符串分割1、输入整数入整数x,将其逆序,将其逆序转化的数字字符化的数字字符以字符串的以字符串的形式存入字符数形式存入字符数组y,然后整体,然后整体输出一个字符串。出一个字符串。数字如何数字如何转换为数字字符?例如数字字符?例如2-2,通,通过2+0或者或者2+48都可都可逆序取逆序取x的各位数存入数的各位数存入数组思路:思路:设置结束标志位设置结束标志位0逆序输出逆序输出平台题平台题11.9从从键盘上上输入一个入一个满足格式(形如足格式(形如“A1,234”)要求的字符串,)要求的字符串,编程将其从分割符(程将其从分割符(“,”)位置分割成两个部分(
22、如)位置分割成两个部分(如A1和和234两两个字符串),并在屏幕上分两行个字符串),并在屏幕上分两行顺序序显示分割后的示分割后的结果(果(输入入输出格式示例如下)。出格式示例如下)。输入:入:A1,234输出出:A1234思路?思路?思路?思路?单词分割单词分割平台题平台题11.10统计单词个数统计单词个数平台题平台题11.611.61、从键盘输入一行字符,统计其中有多少个单词。即书、从键盘输入一行字符,统计其中有多少个单词。即书150页例页例7.8编程思路描述:运用标志word,word是前一个字符是否空格的标识,其值为0,表示前一个字符是空格,其值为1,表示前一个字符不是空格.具体步骤如下:1)如果当前字符是空格,则表示未出现新单词,单词个数num不变,word赋值02)如果当前字符不是空格,则看前一个字符是否空格:如果word为0,则表示前一个字符是空格,则新单词出现,num加1,word赋值1;如果word为1,则表示前一个字符不是空格,则未出现新单词,num值不变。关于蓝桥杯后续课程大一下:计算机软件技术基础陈秀新大二下:面向对象语言与编程杨伟杰