下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义
#define文件包含
#include条件编译
#if--#else--#endif等格式:“#”开头占单独书写行语句尾不加分号7.1
宏定义不带参数宏定义#define”作语法宏体可缺省,表示宏名定义过或取消宏体定义位置:任意(作如用域#d:从efi定ne义#define#undef可终止格式#:defi#nuen宏展开:预编检查标宏d译
不一般形式:
#define
宏名
[宏体]功能:用指定
例YES 1
(宏体)#definemain(){……..}#undef
YES#define
YES
0max(){……..}YES原作用域YES新作用域宏展开:预编译时,用宏体替换宏名---不作语法检查如
if(x==YES)
printf(“correct!\n”);宏\n”);n”);()引号中的内容el与se宏if
名(x=相=同NO也)不置pr换intf(“error!\n”);例
#define
PI
3.14159printf(“2*PI=%f\n”,PI*2);宏展开:printf(“2*PI=%f\n”,3.14159*2);••宏定义中使用必要的括号()例
#define
WIDTH
80#define
LENGTH
(WIDTH+40)var=LENGTH*2;宏展开:var=(80+40)*2;宏展开:var= 80+40
*2;带参数宏定义一般形式:#define宏名(参数表)
宏体I*r*r”例
#define
S(a,b)
a*b………..area=S(3,2);宏展开:
area=3*2;宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号()例
#define
POWER(x)
x*xx=4;
y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)((x)*(x))宏展开:z=((x+y)*(x+y));(x)>(y)?(x):(y)#define
MAX(x,y)…….main(){
int
a,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展开:t=(a+b)>(c+d)?(a+b):(c+d);int max(int
x,int
y){
return(x>y?x:y);main(){ int
a,b,c,d,t;…….t=max(a+b,c+d);………}例
用宏定义和函数实现同样的功能等价}带参的宏与函数区别处带参宏函数理时间编译时程序运行时参数类型无类型问题定义实参,形参类型处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参程序长度变长不变运行速度不占运行时间调用和返回占时间7.2
文件包含功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:
#include或
#include“文件名”<文件名>#include
“file2.cfile1.cfile2.cfile1.cAA处理过程
预取该预处理<>直接按标准 搜索文件编译“”先在当前 搜索,再搜索标准可指定路径被包含文件内容源文件(*.c)头文件(*.h)文件包含可嵌套file1.cAfile3.cC#include
“file2.c#”include
“file3.c”file2.cBfile1.cAfile3.cfile2.c例文件包含举例/*
powers.h
*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)*(x)*(x))#include
<stdio.h>#include
"d:\fengyi\bkc\powers.h"#define MAX_POWER
10void
main(){ intn;printf("number\texp2\t
exp3\t
exp4\n");printf("----\t----\t-----\t------\n");for(n=1;n<=MAX_POWER;n++)printf("%2d\t
%3d\t
%4d\t
%5d\n",n,sqr(n),cube(n),quad(n));}第八章指针8.1
概述C程序设计中使用指针可以:使程序简洁、紧凑、高效有效表示复杂的数据结构动态分配内存方便使用字符串有效使用数组调用函数时可以得到多于1个的值直接处理内存地址8.2
指针的概念一、数据的存取1、内存地址内存的每个字节都有一个编号,这个
称为“内存地址”。低地址高地址2000200220043000程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据。int i,
j,
k;ijk00000011000000000000010100000000…2、内存单元的地址和内存单元的内容的区别:若i=3,j=5;从图中可以看出它们的区别。程序编译后已经没有i、j、k这些变量名了,而是将变量名转换为变量的地址,计算机通过内存地址对变量进行存取。二、直接1、直接低地址高地址2000200220043000ijk000000110000000000000101000000000000100000000000…和间接方式:按变量的地址存取变量的方式①、i=3; ②、j=i+2;③、printf("%d",i);④、scanf("%d",&i);⑤、k=i+j;如何执行?2、间接 方式:C语言中可以定义整型变量、实型变量、字符型变量,各自存放相应类型的数据;另外还可以定义和使用一种特殊类型的变量,用来存放变量的地址。低地址高地址2000200220043000ijk假设已经定义变量ip用来存放整型变量的地址,它被分配到内存单元3000和3001。ip000000110000000000000101000000000000100000000000…2000通过执行语句:ip=&i;
将整型变量i的地址存放到变量ip中,即ip的值为变量i所对应的内存单元的起始地址2000。现在要存取i的值可以这样做:先找到存放i的地址的内存单元地址(3000和3001),从中取出变量i的地址(2000),然后再对2000和2001单元进行存取——这就称为间接 。2000ip3000
2000i变量ip的值为2000,即变量i的地址,这样就在ip和i
之间建立了一种联系:通过变量ip知道变量i的地址,从而找到变量i的内存单元,因此说变量ip指向变量i,用箭头表示这种“指向”关系。3、关于“指向”的含义:4、为了表示将数值10送到变量i中,可以有两种表示方法:2000①、将10送到变量i所标志的单元中;i10②、将10送到变量ip所指向的单元中;20003000ip2000i10三、指针与指针变量通过地址能找到所需的变量单元,可以说:地址
“指向”该变量单元。因此,把一个变量的地址称为该变量的“指针”。高地址低地址2000200220043000ijkip000000110000000000000101000000000000100000000000…2000如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。注意区分“指针”和“指针变量”这两个概念。…...2000整型变量i10变量i_pointer20012002200320042005–指针与指针变量2000指针:一个变量的地址指针变量:专门存放变量地址的变量指针指针变量变量的内容变量的地址变量指针变量变量地址(指针)变量值指向地址存入指针变量①、程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的;②、数据所占有的内存单元个数是由其数据类型决定的③、首地址:即第一个单元的地址;④、表示地址的数与整数的区别;⑤、变量i、j的地址可能相邻,也可能不相邻,是由系统分配的, 不必关心。四、说明8.3指针变量的定义和指针运算符:*为了表示指针变量和它所指向的变量之间的联系,用“*”表示指向的关系。如:ip代表指针变量,*ip表示ip所指向的变量。即*ip也代表一个变量。例:①、若:ip=&i;i=5;②、x=i+1;*ip=5;
结论:*ip与i等价。x=*ip+1;取地址运算符:&它与一个变量连用,以得到该变量的内存地址。说明:①、取地址运算符只能作用于变量:&x,&a[5];不能作用于常量、表达式或寄存器变量:
&25,
&(i+1);②、不能把整数赋值给一个指针变量:ip=3000;③、不能把一个指针变量的值赋值给一个整型变量:x=ip;–&与*运算符含义结合性:自
左含义:取•变量含义:取指针所指向变量的内容单目运算符两者单关目运系算:符互为逆运算优先级:•2理解优先级:2整型变量i变量i_pointer2000200120022003200420052006指针变量…...102000i_pointer-----指针变量,它的内容是地址量*i_pointer----指针的目标变量,它的内容是数据
&i_pointer---指针变量占用内存的地址200010i_pointer*i_pointer&i_pointeripointer
&i
&(*i
pointer)iii_pointer
=
&i
=
&(*i_pointer)i
=*i_pointer
=*(&i)8.3.1
指针变量的定义与赋值法标识符指针变量类型表示定义指针变量指不是‘*’运算符例
int
*p1,*p2;float
*q
;static
char
*name;一、指针变量的定义[
类型]
数据类型
*指针变量名;说明:①“*”只表示定义的变量为指针变量,但指针变量名中并不包含“*”;"*"是指针变量的标志,不可丢②掉指;针变量定义时,指定了它所指向的变量的数据类型;指针变量定义时必须指定其所指向的变量的数据类型,而且使用过程中只能指向同一种类型的变量。③
指针变量定义后,系统为变量分配一个 单元,用来存放地址;根据
单元的长度分为大
模式(长指针,4
Byte)和小 模式(短指针,2Byte);④指针变量定义后,若不赋值,其值是不确定的。二、指针变量的赋值1、赋值语句:int i,
j,
*p1,
*p2;p1=&i;
p2=&j;char ch,
*cp1,
*cp2;cp1=&ch;
cp2=&ch;2、初始化:int i,
*p1=&i;int i,
*p1;p1=&i;一般形式:[
类型]数据类型*指针变量名=初始地址值;赋给指针变量,不是例
inti;int
*p=&i;变量必须已说明过类型应一致例
int
i;int
*p=&i;int
*q=p;用已初始化指针变量作初值例
main(
){
int
i;static
int*p=&i;..............}()不能用auto变量的地址去初始化static型指针3、说明:①、指针变量定义后,若不赋值,其值是不确定的;②、可以给指针变量赋空值(NULL),使指针变量不指向任何变量;ip=NULL;
#define
NULL
0③、指针变量的值为空值(NULL)与未对指针变量赋值,意义不同;④、只能是同类型变量的地址进行赋值;int i,
*ip;char ch,
*cp;ip=&i;cp=&ch;ip=&ch;cp=&i;⑤、可以将数组名或函数名赋给某些类型的指针变量;int
a[10],
*ip;
ip=&a;
ip=a;⑥、不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;
int
*ip;ip=3000;8.3.2
指针变量的ap1p2&a&a3iinntt
aa,,
**pp11,,
**pp22;;
pp11==&&aa;;printf("%x",
p1);pp22==pp11;;**pp11==33;;
pprriinnttff((""%%dd"",,
**pp11));;1、两个运算符:&和*&:取地址运算符;*:指针运算符(间接 符);2、说明:①、&既可作用于一般变量,也可作用于指针变量;②、*只能作用于指针变量;③、表达式中的*p与变量定义中的*p含义不同;int i,
*p=&i;*p=5;④、int a,
*p=&a;int a,
*p;p=&a;int a,
*p;*p=&a;3、指针变量可以进行的操作:int a,
*p1
*p2;①、赋值:
p1=&a;
p2=p1;②、输出:
printf("%x",
p1);③、取内容:*p1=5;a=5;printf("%d",
*p1);#include
<stdio.h>voidmain(
){
int a1=11,
a2=22;int *p1,
*p2;p1=&a1;p2=&a2;printf("%d,
%d\n",
*p1,
*p2);p2=p1;printf("%d,
%d\n",
*p1,
*p2);}11a122a2p1p2&a1*p1&a1*p2多个指针可以指向同一个单元。但在某一时刻,一个指针变量只能指向一个单元,因为指针变量在某一时刻只能存放一个变量的地址值。#include
<stdio.h>void
main(
){
int a1=11,
a2=22;int *p1,
*p2,
*p;p1=&a1;p2=&a2;printf("%d,
%d\n",*p1,
*p2);p=p1;p1=p2;p2=p;printf("%d,
%d\n",
*p1,
*p2);}11a122a2p2&a&ap
&a1p1
&a2*p1&a1*p2使两个指针交换指向#include
<stdio.h>void
main(
){
int a1=11,
a2=22,
t;int *p1,*p2;p1=&a1;p2=&a2;printf("%d,
%d\n",
a1,
a2);t=*p1;*p1=*p2;*p2=t;printf("%d,
%d\n",
a1,
a2);}a1a2tp1p2&a1*p1&a2*p2112211交换两个指针变量所指向变量的值反映了指针变量的 方法:①、将变量的地址赋给指针变量(p1=&a1)②、将一个指针变量赋给另一个指针变量(p2=p1)③、通过指针变量间接 它所指向的变量(*p1)4、*和&运算符的进一步说明:①、若有:p1=&a;
则*p1等价于a;&*p1&(*p1)&a②、*&a*(&a)*pa③、(*p)++等价于:a++
不同于:*p++*p++*(p++)8.3.3指针作为函数参数输入两个整数a、b,按大小顺序输出。#include
<stdio.h>void
swap(int
x,
int
y){ int
temp;temp=x;x=y;y=temp;}void
main(
){ int
a,
b;printf("\nInput
a,
b:
");scanf("%d%d",&a,
&b);if
(a<b)swap(a,
b);printf("max=%d,
min=%d\n",
a,
b);}注意:C语言中的函数调用采用
“传值”方式,即单向传递方式。即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。#include
<stdio.h>void
swap(int
*px,
int
*py){ int
temp;temp=*px;*px=*py;*py=temp;}void
main(
){
int a,
b,
*p1,
*p2;printf("\nInput
a,
b:
");scanf("%d%d",
&a,&b);p1=&a;
p2=&b;if
(a<b)swap(p1,
p2);printf("max=%d,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 糖尿病足伤口的治疗
- 2024年标准玻璃制品买卖协议范本一
- 劳动合同关于周末休息的条款
- 劳动合同不合格补充证明
- 昆法典合同法第六十条
- 防护用品合同范本
- 法院特别委托书授权模板
- 2025年遂宁普通货运从业资格证考试
- 【大学课件】现代管理心理与领导公关论
- 2025年玉溪货运上岗证模拟考试试题
- 2025年山东省春季高考模拟考试英语试卷试题(含答案+答题卡)
- 检验科降低检测报告超时率PDCA持续改进案例
- 买卖合同法律知识及风险防范培训课件
- 2023年辽宁省水资源管理集团有限责任公司招聘考试真题
- GB/T 44264-2024光伏组件清洁机器人通用技术条件
- 2024重庆机场集团公开招聘57人高频考题难、易错点模拟试题(共500题)附带答案详解
- 人教版英语2024七年级上册全册单元测试卷
- 加油加气站 反恐防范重点目标档案 范例2024
- 第5课 推动高质量发展
- 2024年军队文职统一考试《专业科目》管理学真题及答案解析
- 一年级口算练习题一天50道
评论
0/150
提交评论