C语言讲义第8章
合集下载
C语言第8章的课件
p1
i1
p1
&i1
10
&i1
p2
i2
p2
&i2
20
&i2
运行
i1 20 i2 10
21
注意
*p1表达式表示指针变量p1指向的对象。在访问指针变量 指向对象前,指针变量必需已指向明确。
如:float *pa,a; *pa=3.14; /*错误,因为pa尚未指向任何变量*/ pa=&a; *pa=3.14;/*给pa指向变量赋值*/
运行
18
几个指针应用的例子
main()
{ int *p1,*p2,i1,i2;
scanf("%d,%d",&i1,&i2);
p1=&i1;
p2=&i2;
printf("%d,%d\n",*p1,*p2);
p2=p1;
printf("%d,%d\n",*p1,*p2);
}
p1
i1
p1
&i1
10
&i1
指针实际上是对存储单元地址的一种形 象化描述。指针即地址。
4
程序中的变量表示命名了的存储区域。不 同类型变量其存储区域字节单元数不一样。
变量名表示该存储区域的别名。变量值是 该存储区域中存储的数据。变量地址是该存储 区域的首地址。
变量地址可通过对变量名进行取地址运算 得到。如:&a得到变量a的地址。
C语言中指针变量也有类型。指针变量 的类型是指指针变量指向对象的类型,即指 针变量存储的指针所表示的对象的类型。
指针变量定义格式:
类型标识符 * 指针变量名; 12
C语言程序设计知识点—第8章 指针结构体与预处理命令
比较两个指针 #include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。
c语言讲义第08章
4
5
6
7
8
34 78 23 16
3 42 29 67
main( ) {int i,j,p,temp,a[10]; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<9;i++) {p=i; /* 假定当前最小值的位序 */ for(j=p+1;j<10;j++) if(a[p]>a[j]) p=j; temp=a[i];a[i]=a[p];a[p]=temp; } for(i=0;i<10;i++) printf("%4d",a[i]); printf("\n");}
通过不同的下标来标识区分不同的数据,数 组中的数据都是按照一定的顺序排列组合, 同时,以顺序的方式存储在内存。
例如:a1,a2,a3,……an序列
2、数组元素:数组里的每一个成员称为数组元素, 用数组名和相应的下标序号表示。
例如:a[3]表示数组a的第四个元素(起始下标从 0开始) 3、数组的维数:数组中用于标识下标序号的个数 称为数组的维数。 只有一个下标标识的数组为一维数组, 用两个下标标识的为二维数组。 例如:b[3][4]表示b为二维数组中第四行第五列 的元素
数,不能被2整除的数是奇数。
int a[10]={-8,43,22,75,66,54,108,99,-19,111}; main() { int num_odd=0,num_even=0; int i; for(i=0;i<10;i++) { if(a[i]%2==0) num_even++; else num_odd++; } printf("\neven number:%d,odd_number:%d", num_even,num_odd); }
C语言课件第08章
C语言允许函数的递归调用。在递归调用中,调用 函数又是被调用函数,执行递归函数将反复调用其自身。 每调用一次就进入新的一层。
为了防止递归调用无终止地进行,必须在函数内有 终止递归调用的手段。常用的办法是加条件判断,满足 某种条件后就不再作递归调用,然后逐层返回。
递归阶段
递推阶段
递归结束条件
void main()
}
说明:
(1)实参可以是常量、变量、表达式、函数等。无论 实参是何种类型的量,在进行函数调用时,它们都必须具有 确定的值,以便把这些值传送给形参。
因此,应预先用赋值、输入等办法,使实参获得确定的 值。
(2)形参变量只有在被调用时,才分配内存单元;调 用结束时,即刻释放所分配的内存单元。
因此,形参只有在该函数内有效。调用结束,返回调用 函数后,则不能再使用该形参变量。
函数8.的1 定函义数的定义与调用
函数的返回值与函数类型 对被调用函数的说明和函数原型 函数的调用 函数的形参与实参
[Return]
8.1 .1 函数的定义
1.任何函数(包括主函数main())都是由函数说明和函 数体两部分组成。根据函数是否需要参数,可将函数分为无 参函数和有参函数两种。
(1)无参函数的一般形式
getch();
n
} /* */
100 ni
void s(int n)
100
{ int i;
printf("n_x=%d\n",n);
/*输出改变前形参的值*/
for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/
printf("n_x=%d\n",n);
/*输出改变后形参的值*/
为了防止递归调用无终止地进行,必须在函数内有 终止递归调用的手段。常用的办法是加条件判断,满足 某种条件后就不再作递归调用,然后逐层返回。
递归阶段
递推阶段
递归结束条件
void main()
}
说明:
(1)实参可以是常量、变量、表达式、函数等。无论 实参是何种类型的量,在进行函数调用时,它们都必须具有 确定的值,以便把这些值传送给形参。
因此,应预先用赋值、输入等办法,使实参获得确定的 值。
(2)形参变量只有在被调用时,才分配内存单元;调 用结束时,即刻释放所分配的内存单元。
因此,形参只有在该函数内有效。调用结束,返回调用 函数后,则不能再使用该形参变量。
函数8.的1 定函义数的定义与调用
函数的返回值与函数类型 对被调用函数的说明和函数原型 函数的调用 函数的形参与实参
[Return]
8.1 .1 函数的定义
1.任何函数(包括主函数main())都是由函数说明和函 数体两部分组成。根据函数是否需要参数,可将函数分为无 参函数和有参函数两种。
(1)无参函数的一般形式
getch();
n
} /* */
100 ni
void s(int n)
100
{ int i;
printf("n_x=%d\n",n);
/*输出改变前形参的值*/
for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/
printf("n_x=%d\n",n);
/*输出改变后形参的值*/
c语言课件第8章
例3: : 以下宏定义: 以下宏定义: #define X 5 #define Y X+1 #define Z Y*X/2 则执行以下printf语句后,输出结果是: A 语句后, 则执行以下 语句后 输出结果是: int a;a=Y; printf(“%d\n”,Z); printf(“%d”,--a); A)7 B) 12 C) 12 D)15 ) ) ) ) 5 6 5 5
例8: : C 叙述不正确的是 A)预处理命令行须冠以 )预处理命令行须冠以# B)冠以 号的命令行都是预处理命令行 )冠以#号的命令行都是预处理命令行 C)在程序执行中对预处理行进行处理 ) D)#define IBM_PC是正确的宏定义 ) 是正确的宏定义
例9: : C 以下叙述正确的是 A)一行可出现多个预处理命令行 ) B)预处理行是合法语句 ) C)被包含文件的后缀未必是 )被包含文件的后缀未必是.h D)被定义的宏名 ,在程序中可以重新 )被定义的宏名PI 定义
注意: 注意
• 宏展开时不求参数值 • 宏名和参数无类型 • 字符串可以是任意类型
例1:分析下列两个程序的运行结果 : #include<stdio.h> main() { int i=1; while(i<=10) printf(“ %d\n”,square(i++) ); } int square(int n) { return(n*n);} 结果: 结果: 1 4 9 16 25 36 49 64 81 100 #include<stdio.h> #define square(n) n*n main() { int i=1, s; while(i<=10) {s= square(i++); printf(“ %d\n”,s);} } 结果: 结果: 1 9 25 49 81
高树芳C语言程序设计--第八章
30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数
C语言程序设计基础 第8章 数据文件处理技术
offset为long型的位移量,以ptname为基准,移动 的字节数。
函数返回值:成功移动返回0,否则返回非0。
10. 函数fseek-例 【例1】 fseek (fp, 40L, SEEK_SET); 表示:将当前位置移到离文件头40个字节处。 【例2】 fseek(fp, 20L, SEEK_CUR); 表示:将当前位置移到离当前位置20个字节处。 【例3】 fseek(fp, -30L, SEEK_END);
文件不能打开时,函数 fopen()将返回空指针值 NULL。 程序应考虑到文件不能正常打开的极端情况,应用以下形式 的代码描述打开一个文件的要求: if ((fp = fopen(fname, "r")) == NULL) { printf("不能打开文件 %s。\n", fname); return; }
fputc()和fgetc()函数-例2
【例2】将一个文件中的数据复制到另一个文件中。 #include <stdio.h>
void main()
{ FILE *in, *out; char ch, infile[40], outfile[40]; gets (infile); if (( in = fopen(infile, "r")) == NULL) { printf ("不能打开源文件 %s\n", infile); scanf ("%*c"); return; } /* 起暂停作用 */
12. 成批读数据函数fread() 形式指向的文件读入count*size个字节,存入buffer。 函数返回值:读取成功返回count值,否则返回0。
说明:常用于二进制文件的读。
C语言程序设计(第八章)
字符读写函数fgetc()和fputc()是以字符(字节)为单位
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()
C语言第8章 指针
数据类型 *函数名(形参表) { 函数体; }
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果
C语言讲义第8章
①实参的个数和形参的个数是否一致;
②实参表达式的类型和形参类型是否相符,如果不符 则需要进行必要的类型转换;
③函数返回值类型和主调函数环境是否相符,如果不 符也需要进行必要的类型转换。
11/15/2019
22
函数声明的形式
函数的声明是函数特征的描述。它将函数的特征告 知编译器。函数声明的一般形式为:
被调函数执行完毕后,恢复主调函数的现场,并处理返回
值。计算机的控制权重新由主调函数接管。主调函数执行
中断点的后继语句,如图8-1所示。
11/15/2019
20
图8-1 函数的调用过程
11/15/2019
函数调用时,主调 函数把实参表达式 的值传递给被调函 数的形参变量。C语 言的参数传递机制 是值的单向传递。 函数调用时的处理 过程如下:
定义函数头部时,参数列表中出现的参数称为形式参数。简 称为形参。
11/15/2019
5
2. 函数体
函数体是函数功能的具体实现过程,是一个普通的 复合结构。一般包括变量的定义和声明部分、语句序 列部分。其一般形式为:
{ 变量定义和声明 语句序列
}
注意:C语言要求变量定义和说明必须放在语句之前
11/15/2019
函数执行到复合结构的末尾,依然会正常结束。虽然没 有return语句,但该函数仍然有返回值。函数的返回值将是一 个随机值,即不确定的值,而不是result的值。
无返回值的函数。当函数的返回值类型定义为“void”时,则 明确表明函数没有返回值。
11/15/2019
12
【例8.3】 定义一个函数,输出6个“*”号。
11/15/2019
24
总结
函数的定义形式 函数类型 函数的参数 函数中形式参数和实际参数的数据传递 函数的返回值
②实参表达式的类型和形参类型是否相符,如果不符 则需要进行必要的类型转换;
③函数返回值类型和主调函数环境是否相符,如果不 符也需要进行必要的类型转换。
11/15/2019
22
函数声明的形式
函数的声明是函数特征的描述。它将函数的特征告 知编译器。函数声明的一般形式为:
被调函数执行完毕后,恢复主调函数的现场,并处理返回
值。计算机的控制权重新由主调函数接管。主调函数执行
中断点的后继语句,如图8-1所示。
11/15/2019
20
图8-1 函数的调用过程
11/15/2019
函数调用时,主调 函数把实参表达式 的值传递给被调函 数的形参变量。C语 言的参数传递机制 是值的单向传递。 函数调用时的处理 过程如下:
定义函数头部时,参数列表中出现的参数称为形式参数。简 称为形参。
11/15/2019
5
2. 函数体
函数体是函数功能的具体实现过程,是一个普通的 复合结构。一般包括变量的定义和声明部分、语句序 列部分。其一般形式为:
{ 变量定义和声明 语句序列
}
注意:C语言要求变量定义和说明必须放在语句之前
11/15/2019
函数执行到复合结构的末尾,依然会正常结束。虽然没 有return语句,但该函数仍然有返回值。函数的返回值将是一 个随机值,即不确定的值,而不是result的值。
无返回值的函数。当函数的返回值类型定义为“void”时,则 明确表明函数没有返回值。
11/15/2019
12
【例8.3】 定义一个函数,输出6个“*”号。
11/15/2019
24
总结
函数的定义形式 函数类型 函数的参数 函数中形式参数和实际参数的数据传递 函数的返回值
c语言课件第8章
文本文件
*.OBJ
目标文件
二进制文件
*.EXE
可执行文件
二进制文件
文件的存储特性
文件是一个有序的数据序列。C语言把文件作 为一个字符(字节)序列处理,对文件的存取是 以字符(字节)为单位进行的。
2020/9/25
8.1 文件的概述
4
8.1.1 文件和文件指针
1. 什么是文件
设备文件
在C语言中,“文件”的概念被进一步扩大, 把每台与主机相连的输入输出设备都看作是一个 文件。即把实际的物理设备抽象为逻辑文件,它 们被称为设备文件。
向文件写数据时,也是先将 变量中数据送到缓冲区,待缓冲 区装满后,再一起存到磁盘文件 中。
8
程序区
数据区
输入 输出 文件
缓冲区
内存
磁盘文件 输出
输入 外存
图8.2 系统对缓冲文件的处理
2020/9/25
8.1 文件的概述
9
8.1.1 文件和文件指针
3. 缓冲文件和文件指针
文件类型指针
在缓冲文件系统中,对每个正在使用的文件 typ都存ed自e放f 动文ssuthnros件分urictgtn的配ed{有一关个信FlfIelL息vaEegls类,;; 型如//**的文fFii结件llle/构号setmap体、ttuy变s文lfe量件lvaegl状,sof态用b*u、于/ffer */
对外部设备的输入输出就是对设备文件的 读写。
2020/9/25
8.1 文件的概述
5
8.1.1 文件和文件指针
2. 文件的种类
按文件存储数据的形式
➢ ASCII文件(或称文本文件) ASCII码文件中每个字节存放一个ASCII代码,代表
《c语言程序设计教学资料》第8章---数组
printf(“%d”, a[i]);
一维数组的初始化
不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素, 初值为0,而对字符型数组元素,初值为空字符 ‘\0’ 对数组元素初始化的实现方法:
1.在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。经过上 面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2, a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8, a[9]=9。
0
30
b1]
1
34
b[2]
2
38
b[3]
3
3c
b[4]
4
40
c
52
44
a
61
48
i
14678910235
4c
b[8]
8
50
b[9]
9
54
b[10]
10
58
c和a的值因数组越界编辑p而pt 被破坏了 b[11]
11
5c
二维数组程序举例
例: 将一个二维数组行和列元素互换,存到另一个二维数 组中。
数组名 [下标] 下标可以是整型常量或整型表达式。例如: a[0]=a[5]+a[7]-a[2*3]
注意
定义数组时用到的“数组名[常量表达式]” 和引用数 组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; // 定义数组长度为10
t=a[6]; //引用a数组中序号为6的元素
sizeof(数组名)
编辑ppt
一维数组的初始化
不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素, 初值为0,而对字符型数组元素,初值为空字符 ‘\0’ 对数组元素初始化的实现方法:
1.在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。经过上 面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2, a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8, a[9]=9。
0
30
b1]
1
34
b[2]
2
38
b[3]
3
3c
b[4]
4
40
c
52
44
a
61
48
i
14678910235
4c
b[8]
8
50
b[9]
9
54
b[10]
10
58
c和a的值因数组越界编辑p而pt 被破坏了 b[11]
11
5c
二维数组程序举例
例: 将一个二维数组行和列元素互换,存到另一个二维数 组中。
数组名 [下标] 下标可以是整型常量或整型表达式。例如: a[0]=a[5]+a[7]-a[2*3]
注意
定义数组时用到的“数组名[常量表达式]” 和引用数 组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; // 定义数组长度为10
t=a[6]; //引用a数组中序号为6的元素
sizeof(数组名)
编辑ppt
C语言 第八章 结构体
共用体
3)直接定义联合变量 union {
int i;
float f; }num; 说明:(1)共用体变量的所有成员占有同一段内存,所占内存空 间是其成员中字节数最大的成员占有的字节数。
(2)共用体变量中可以定义许多不同类型的成员,但同一时刻只
有一个成员的数据有效。
共用体
4.共用体变量初始化 初始化时,只能对第一个成员的数据类型初始化。 例:union data num={10}; 正确 union data num={10,25.4}; 错误
结构体变量
方法三:定义结构体类型的同时定义结构体变量,省略结构体类型名
struct DATE{ int year; int month; int day;}; struct {
long int number;
char name[8]; int age;
char *sex;
struct DATE birthday; }stu1,stu2;
数据类型
数据类型
成员名1;
成员名2;
//成员表
……
};
结构体类型
2.结构体类型的定义: 说明: (1) struct是关键字,标识一个结构体类型定义的开头 (2)“结构体类型名”是表示该结构体类型的名称的标识符,可
类比int、char
(3)“成员表”是构成结构体类型的成份,由一个或多个成员构
成,每个成员有自己的成员名。各成员数据类型可以不同,既可以
枚举类型
3.枚举变量定义
方式一:类型和变量分开定义 enum WEEKDAY{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义枚举类型 enum WEEKDAY w;//定义枚举变量w
c语言课件第8章
8.1.2带参宏定义 带参宏定义的一般形式: #define 标识符(形参表) 字符串 其中,形参表是由一个或多个形参组成。 带参宏调用的一般形式:
宏名(实参表);
例:编写一个程序,求3个数中的最大数,要求用带参数 的宏实现。
#include <stdio.h> #define MAX1(a,b) ((a)>(b)?(a):(b)) #define MAX2(a,b,c) (MAX1(a,b)>(c)?MAX1(a,b):(c))
功能:首先计算“常数表达式”的值,如果为真 (非零),就编译“程序段1”,否则编译“程序 段2”。如果没有#else部分,则当“常数表达式” 的值为0时,直接跳过#endif。
例:阅读程序。 #include <stdio.h> main() { #if NULL
printf("NULL is non-zero value!\n"); #else printf("NULL is zero value!\n"); #endif } 运行结果:NULL is zero value!
错
8.2 文件包含
文件包含也是一种预处理语句,它的作用是使一 个源程序文件将另一个源程序文件的全部包含进 来。一般形式为: #include <文件名>或 #include “文件名”
“文件包含”示意图
file1.c
包含
#include”file2.c”
file2.c
A
B
(a)
(b)
file1.c
main() {int a=23;
printf("MAX=%d\n",MAX2(13+5,4,a)); }
c语言第8章
如:
int max(int x,int y) {int z;
z=x>y?x:y;
return(z); } 说明:如果在定义函数时不指定函数类型,则 系统会自动将函数类型指定为int型。
8.2 函数定义的一般形式
对形参的声明的传统方式
将对形参的声明放在函数定义的第2行,在括号外单独指定。
如: int max(x,y)
fun(int x,int y) {x=x*x; main() {int a,b,c;
y=y*y;
printf(“x=%d,y=%d\n”,x,y); }
sacnf(“%d,%d”,&a,&b);
c=fun(a,b); printf(“a=%d,b=%d”,a,b); }
8.3.2 函数的返回值
(1)函数的返回值是通过函数中的return语句获得的。 return后面的值可以是一个变量,也可以是表达式。 如:
printf("sum if %f",c);
}
8.4.3 对被调用函数的声明和函数原型
float add(float x,float y)
{float z; z=x+y;
return(z);
} 运行结果: 3.6 6.5 sum if 10.100000
8.4.3 对被调用函数的声明和函数原型
注意函数定义与函数声明的区别:
8.4.2 函数调用的方式
2、把函数调用作为表达式的一部分——函数表 达式
一般形式为:变量名=函数表达式;
这时要求函数带回一个确定的值以参加表达 式的运算。
如:c=2*max(a,b);
8.4.2 函数调用的方式
3、把函数调用作为一个函数的实参——函数参数
int max(int x,int y) {int z;
z=x>y?x:y;
return(z); } 说明:如果在定义函数时不指定函数类型,则 系统会自动将函数类型指定为int型。
8.2 函数定义的一般形式
对形参的声明的传统方式
将对形参的声明放在函数定义的第2行,在括号外单独指定。
如: int max(x,y)
fun(int x,int y) {x=x*x; main() {int a,b,c;
y=y*y;
printf(“x=%d,y=%d\n”,x,y); }
sacnf(“%d,%d”,&a,&b);
c=fun(a,b); printf(“a=%d,b=%d”,a,b); }
8.3.2 函数的返回值
(1)函数的返回值是通过函数中的return语句获得的。 return后面的值可以是一个变量,也可以是表达式。 如:
printf("sum if %f",c);
}
8.4.3 对被调用函数的声明和函数原型
float add(float x,float y)
{float z; z=x+y;
return(z);
} 运行结果: 3.6 6.5 sum if 10.100000
8.4.3 对被调用函数的声明和函数原型
注意函数定义与函数声明的区别:
8.4.2 函数调用的方式
2、把函数调用作为表达式的一部分——函数表 达式
一般形式为:变量名=函数表达式;
这时要求函数带回一个确定的值以参加表达 式的运算。
如:c=2*max(a,b);
8.4.2 函数调用的方式
3、把函数调用作为一个函数的实参——函数参数
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11/1/2016 13
8.3 函数的调用
1. 有参函数的调用
使用已经定义函数的过程,称为函数的调用。类似于代数中 对函数的使用,C语言中对有参函数的调用,是为其形参代入 指定的值,再由其完成既定计算的过程。 有参函数调用的一般形式为: 函数名 (参数列表) 其中,参数列表的一般形式为: 表达式,表达式,…,表达式 调用函数时,首先需要计算这些表达式的值,然后将这些值 传递给形参,这些表达式称为实际参数,简称为实参。 实参的个数,必须与被调用函数的形参个数一样多。各个实 参表达式的数据类型,应该分别与被调用函数形参的数据类 型一致。当二者的数据类型不一致时,系统将自动进行数据 类型的转换:实参将按照形参的数据类型参加运算。 11/1/2016 14
第8章 函数(一)
主要内容
模块化是结构化程序设计的重要思想,函数是C 语言实现模块化程序设计的重要机制。 函数的功能 函数的定义 函数的调用 函数中形式参数和实际参数的数据传递 重点:函数的定义和引用是C语言程序的基本组成部分。编写程 序的主要工作,实际上就是编写各个函数。 每一个函数在使用前必须先定义 一个函数的定义包括两部分
11/1/2016
17
【例8.5】编写程序,通过调用PtrStar函数,输出4行“@” 号,每行10个。 # include <stdio.h> void PrtStar ( ) { printf ( "@@@@@@@@@@\n" ); } int main ( ) { int i = 0; while ( i < 4 ) { PrtStar ( ); i = i + 1; } return 0; }11/1/2016
11/1/2016
24
总 结
函数的定义形式 函数类型 函数的参数 函数中形式参数和实际参数的数据传递 函数的返回值 函数的调用的过程 函数原型
函数头部 函数体
11/1/2016
3
1. 函数头部
函数头部的一般形式为: 类型 函数名 ( 参数列表 ) 函数头部部分,分别定义了函数的类型、函数的名字、参 数列表。该部分定义的是函数的基本特征,是函数使用者 (包括函数定义者)必须遵循的标准,称为“接口”。其 中: 函数的类型,指的是该函数计算结果的数据类型,也 称为函数返回值的数据类型。函数返回值的数据类型, 可以是任意一种数据类型,也可以是空类型“void”。 函数名是一个标识符。定义函数名时,需遵循标识符 的命名法则。
18
【例8.6】编写程序调用函数imin,计算3个整数的最小值。 # include <stdio.h> int imin ( int x, int y ) { if ( x > y ) return y; else return x; } int main ( ) { int n1, n2, n3; scanf ( "%d%d%d", &n1, &n2, &n3 ); printf ( "\nresult = %d\n", imin ( imin ( n1, n2 ), n3 ) ); return 0; }
11/1/2016 20
图8-1 函数的调用过程
函数调用时,主调 函数把实参表达式 的值传递给被调函 数的形参变量。C语 言的参数传递机制 是值的单向传递。 函数调用时的处理 过程如下: (1) 计算各个实 参表达式的值。 (2) 把这些值分 别“赋值”给对 应的形参变量。 (3) 开始执行函 数体。
11/1/2016
11
注意:
定义函数的头部时,如果不指明函数返回值的数据类型,编 译器默认该函数返回值的数据类型为int型。 有返回值的函数的计算结果,只有通过返回语句,才能向函 数的使用者返回指定的计算结果。 有返回值的函数。函数的计算结果就是函数的返回值。这 一结果通过return语句返回给调用者。 如果无return语句,或没有执行到return语句,则函数并非 不返回值,而是返回一个不确定的值。例如, int fun ( ) { int result; result = 3 * 7; } 函数执行到复合结构的末尾,依然会正常结束。虽然没 有return语句,但该函数仍然有返回值。函数的返回值将是一 个随机值,即不确定的值,而不是result的值。 无返回值的函数。当函数的返回值类型定义为“void”时,则 明确表明函数没有返回值。
11/1/2016 5
2. 函数体
函数体是函数功能的具体实现过程,是一个普通的 复合结构。一般包括变量的定义和声明部分、语句序 列部分。其一般形式为:
{ 变量定义和声明 语句序列
}
注意:C语言要求变量定义和说明必须放在语句之前
11/1/2016 6
【例8.1】函数体的定义
double perimeter ( double radius ) { /*变量定义和声明部分*/ int num1, num2 = 4; char ch = A; double num3; …… /*语句序列部分*/ num1 = 3 * num2; num3 = num1 + num2; …… }
11/1/2016 23
注意: (1) 同一个函数的定义,只有一个。 (2) 同一个函数的调用和声明可以有多处。 (3) 被调用函数的定义,如果和主调函数在同一个源 文件中,并且是在主调函数的前面定义的,被调用 函数的声明可以省略。 声明的函数也称为函数的原型。 函数的原型和函数的头部相似。在已经定义的函数 的头部,再加一个分号,即为函数的原型。
/*“2 * 3.1415926 * radius”的值,即为函数的计算结果*/
11/1/2016
10
2. 函数的功能
按照函数的功能不同,可以将C语言的函数分为两类: 一类函数用于计算一个值,称为具有返回值的函数; 一类函数仅仅是为了实现一个过程,而不是为了得到一个 值,称为无返回值的函数。 在C语言程序中,每一个运算对象都有数据类型,函数的返回 值也不例外。如果函数的功能仅仅是为了表示一个过程,不 需要返回值,应该将函数返回值的数据类型设置为空类型, 即void类型。否则,定义函数时,应该定义函数返回值的数 据类型。
11/1/2016 22
函数声明的形式 函数的声明是函数特征的描述。它将函数的特征告 知编译器。函数声明的一般形式为: 数据类型 函数名(数据类型 参数名,数据类型 参 数名,…,数据类型 参数名); 或 数据类型 函数名(数据类型,数据类型,…,数 据类型); 第二种形式的参数列表中,不带形参名字。编译器 只检查参数的个数和参数的类型,并不检查形参的 名字(形参名字只在函数体内部使用),因此,声 明函数时参数列表中参数的名字经常省略。
11/1/2016 19
3. 函数调用的方式 函数的调用,会使程序的控制流程发生相应的改变。 主调函数是按顺序执行的。当执行到一个函数的调 用时,它的控制流程会暂时中断,主调函数执行的 现场会被保存起来,计算机的控制权由被调函数接 管:
首先构造被调函数的运行环境,把实参表达式的值传递给 形参变量 然后开始依次执行被调函数函数体的各条语句,直到被调 函数执行完毕(遇到return语句或者执行到函数体的最后 一条语句)。 被调函数执行完毕后,恢复主调函数的现场,并处理返回 值。计算机的控制权重新由主调函数接管。主调函数执行 中断点的后继语句,如图8-1所示。
11/1/2016 4
函数参数 定义参数列表的一般形式为: 数据类型 参数名, 数据类型 参数名, …, 数据类型 参数名 函数头部的参数列表可以为空即参数列表不包括任何参数。 此类函数称为无参函数。 函数头部的参数列表也可以包括一个或多个参数,此类函数 称为有参函数。 注意: 定义无参函数时,函数名后面的圆括号不能省略。 定义有参函数时,如果包括多个参数,参数之间必须用逗 号隔开。对每一个参数,都必须单独定义其数据类型。 定义函数头部时,参数列表中出现的参数称为形式参数。简 称为形参。
21
11/1/2016
4. 函数的声明与函数的原型
函数作为运算对象的一种,必须“先定义后使用” 。 一个函数能够被调用必须具备下列两个条件。 (1) 被调用函数已经有定义。 (2) 被调用函数已经声明。C语言程序的基本编译单位是文 件。编译主调函数所在的源文件时,在主调函数之前,必 须能够让编译器看到被调用函数的特征。 ①实参的个数和形参的个数是否一致; ②实参表达式的类型和形参类型是否相符,如果不符 则需要进行必要的类型转换; ③函数返回值类型和主调函数环境是否相符,如果不 符也需要进行必要的类型转换。
1. 形式参数和实际参数
函数定义中出现在参数列表中的变量称为形式 参数,简称形参。 函数调用中出现在参数位置的表达式称为实际 参数,简称实参。 一个函数可以有一个或多个参数,也可以没有 参数。
11/1/2016
15
【例8.4】编写程序,通过调用函数imin,求两个表达式的 最小值。 # include <stdio.h> int imin ( int x, int y ) { if ( x > y ) return y; else return x; } int main ( ) { int num1, num2, result; scanf ( "%d%d", &num1, &num2 ); result = imin ( num1 + num2, num1 * num2 ); printf ( "result = %d\n", result ); 调用imin函数的main result = imin ( 5 * 6, 4.6 ); 函数,称为主调函数。 printf ( "result = %d\n", result ); 被调用的imin函数, return 0; 称为被调函数。 }
8.3 函数的调用
1. 有参函数的调用
使用已经定义函数的过程,称为函数的调用。类似于代数中 对函数的使用,C语言中对有参函数的调用,是为其形参代入 指定的值,再由其完成既定计算的过程。 有参函数调用的一般形式为: 函数名 (参数列表) 其中,参数列表的一般形式为: 表达式,表达式,…,表达式 调用函数时,首先需要计算这些表达式的值,然后将这些值 传递给形参,这些表达式称为实际参数,简称为实参。 实参的个数,必须与被调用函数的形参个数一样多。各个实 参表达式的数据类型,应该分别与被调用函数形参的数据类 型一致。当二者的数据类型不一致时,系统将自动进行数据 类型的转换:实参将按照形参的数据类型参加运算。 11/1/2016 14
第8章 函数(一)
主要内容
模块化是结构化程序设计的重要思想,函数是C 语言实现模块化程序设计的重要机制。 函数的功能 函数的定义 函数的调用 函数中形式参数和实际参数的数据传递 重点:函数的定义和引用是C语言程序的基本组成部分。编写程 序的主要工作,实际上就是编写各个函数。 每一个函数在使用前必须先定义 一个函数的定义包括两部分
11/1/2016
17
【例8.5】编写程序,通过调用PtrStar函数,输出4行“@” 号,每行10个。 # include <stdio.h> void PrtStar ( ) { printf ( "@@@@@@@@@@\n" ); } int main ( ) { int i = 0; while ( i < 4 ) { PrtStar ( ); i = i + 1; } return 0; }11/1/2016
11/1/2016
24
总 结
函数的定义形式 函数类型 函数的参数 函数中形式参数和实际参数的数据传递 函数的返回值 函数的调用的过程 函数原型
函数头部 函数体
11/1/2016
3
1. 函数头部
函数头部的一般形式为: 类型 函数名 ( 参数列表 ) 函数头部部分,分别定义了函数的类型、函数的名字、参 数列表。该部分定义的是函数的基本特征,是函数使用者 (包括函数定义者)必须遵循的标准,称为“接口”。其 中: 函数的类型,指的是该函数计算结果的数据类型,也 称为函数返回值的数据类型。函数返回值的数据类型, 可以是任意一种数据类型,也可以是空类型“void”。 函数名是一个标识符。定义函数名时,需遵循标识符 的命名法则。
18
【例8.6】编写程序调用函数imin,计算3个整数的最小值。 # include <stdio.h> int imin ( int x, int y ) { if ( x > y ) return y; else return x; } int main ( ) { int n1, n2, n3; scanf ( "%d%d%d", &n1, &n2, &n3 ); printf ( "\nresult = %d\n", imin ( imin ( n1, n2 ), n3 ) ); return 0; }
11/1/2016 20
图8-1 函数的调用过程
函数调用时,主调 函数把实参表达式 的值传递给被调函 数的形参变量。C语 言的参数传递机制 是值的单向传递。 函数调用时的处理 过程如下: (1) 计算各个实 参表达式的值。 (2) 把这些值分 别“赋值”给对 应的形参变量。 (3) 开始执行函 数体。
11/1/2016
11
注意:
定义函数的头部时,如果不指明函数返回值的数据类型,编 译器默认该函数返回值的数据类型为int型。 有返回值的函数的计算结果,只有通过返回语句,才能向函 数的使用者返回指定的计算结果。 有返回值的函数。函数的计算结果就是函数的返回值。这 一结果通过return语句返回给调用者。 如果无return语句,或没有执行到return语句,则函数并非 不返回值,而是返回一个不确定的值。例如, int fun ( ) { int result; result = 3 * 7; } 函数执行到复合结构的末尾,依然会正常结束。虽然没 有return语句,但该函数仍然有返回值。函数的返回值将是一 个随机值,即不确定的值,而不是result的值。 无返回值的函数。当函数的返回值类型定义为“void”时,则 明确表明函数没有返回值。
11/1/2016 5
2. 函数体
函数体是函数功能的具体实现过程,是一个普通的 复合结构。一般包括变量的定义和声明部分、语句序 列部分。其一般形式为:
{ 变量定义和声明 语句序列
}
注意:C语言要求变量定义和说明必须放在语句之前
11/1/2016 6
【例8.1】函数体的定义
double perimeter ( double radius ) { /*变量定义和声明部分*/ int num1, num2 = 4; char ch = A; double num3; …… /*语句序列部分*/ num1 = 3 * num2; num3 = num1 + num2; …… }
11/1/2016 23
注意: (1) 同一个函数的定义,只有一个。 (2) 同一个函数的调用和声明可以有多处。 (3) 被调用函数的定义,如果和主调函数在同一个源 文件中,并且是在主调函数的前面定义的,被调用 函数的声明可以省略。 声明的函数也称为函数的原型。 函数的原型和函数的头部相似。在已经定义的函数 的头部,再加一个分号,即为函数的原型。
/*“2 * 3.1415926 * radius”的值,即为函数的计算结果*/
11/1/2016
10
2. 函数的功能
按照函数的功能不同,可以将C语言的函数分为两类: 一类函数用于计算一个值,称为具有返回值的函数; 一类函数仅仅是为了实现一个过程,而不是为了得到一个 值,称为无返回值的函数。 在C语言程序中,每一个运算对象都有数据类型,函数的返回 值也不例外。如果函数的功能仅仅是为了表示一个过程,不 需要返回值,应该将函数返回值的数据类型设置为空类型, 即void类型。否则,定义函数时,应该定义函数返回值的数 据类型。
11/1/2016 22
函数声明的形式 函数的声明是函数特征的描述。它将函数的特征告 知编译器。函数声明的一般形式为: 数据类型 函数名(数据类型 参数名,数据类型 参 数名,…,数据类型 参数名); 或 数据类型 函数名(数据类型,数据类型,…,数 据类型); 第二种形式的参数列表中,不带形参名字。编译器 只检查参数的个数和参数的类型,并不检查形参的 名字(形参名字只在函数体内部使用),因此,声 明函数时参数列表中参数的名字经常省略。
11/1/2016 19
3. 函数调用的方式 函数的调用,会使程序的控制流程发生相应的改变。 主调函数是按顺序执行的。当执行到一个函数的调 用时,它的控制流程会暂时中断,主调函数执行的 现场会被保存起来,计算机的控制权由被调函数接 管:
首先构造被调函数的运行环境,把实参表达式的值传递给 形参变量 然后开始依次执行被调函数函数体的各条语句,直到被调 函数执行完毕(遇到return语句或者执行到函数体的最后 一条语句)。 被调函数执行完毕后,恢复主调函数的现场,并处理返回 值。计算机的控制权重新由主调函数接管。主调函数执行 中断点的后继语句,如图8-1所示。
11/1/2016 4
函数参数 定义参数列表的一般形式为: 数据类型 参数名, 数据类型 参数名, …, 数据类型 参数名 函数头部的参数列表可以为空即参数列表不包括任何参数。 此类函数称为无参函数。 函数头部的参数列表也可以包括一个或多个参数,此类函数 称为有参函数。 注意: 定义无参函数时,函数名后面的圆括号不能省略。 定义有参函数时,如果包括多个参数,参数之间必须用逗 号隔开。对每一个参数,都必须单独定义其数据类型。 定义函数头部时,参数列表中出现的参数称为形式参数。简 称为形参。
21
11/1/2016
4. 函数的声明与函数的原型
函数作为运算对象的一种,必须“先定义后使用” 。 一个函数能够被调用必须具备下列两个条件。 (1) 被调用函数已经有定义。 (2) 被调用函数已经声明。C语言程序的基本编译单位是文 件。编译主调函数所在的源文件时,在主调函数之前,必 须能够让编译器看到被调用函数的特征。 ①实参的个数和形参的个数是否一致; ②实参表达式的类型和形参类型是否相符,如果不符 则需要进行必要的类型转换; ③函数返回值类型和主调函数环境是否相符,如果不 符也需要进行必要的类型转换。
1. 形式参数和实际参数
函数定义中出现在参数列表中的变量称为形式 参数,简称形参。 函数调用中出现在参数位置的表达式称为实际 参数,简称实参。 一个函数可以有一个或多个参数,也可以没有 参数。
11/1/2016
15
【例8.4】编写程序,通过调用函数imin,求两个表达式的 最小值。 # include <stdio.h> int imin ( int x, int y ) { if ( x > y ) return y; else return x; } int main ( ) { int num1, num2, result; scanf ( "%d%d", &num1, &num2 ); result = imin ( num1 + num2, num1 * num2 ); printf ( "result = %d\n", result ); 调用imin函数的main result = imin ( 5 * 6, 4.6 ); 函数,称为主调函数。 printf ( "result = %d\n", result ); 被调用的imin函数, return 0; 称为被调函数。 }