六、函数
1.函数的嵌套调用2.全局变量3.递归调用4.局部变量与全局变量5.指针的传递题目6.malloc的使用题目7.走台阶问题 七、结构体
1.结构体2.结构体指针3.typedef的使用4.C++的引用
六、函数 1.函数的嵌套调用main.c
#include "func.h"
int main()
{
int a = 10;
a = printstar(a);//printstar(a)函数调用,a是一个实参
print_message();//调用print_message
printstar(a);
printf("a=%dn", a);
return 0;
}
func.c
#include "func.h"
//printstar函数定义,就是函数实现
int printstar(int i)//i即为形式参数,也叫形参
{
printf("***************************n");
printf("printstar %dn", i);
return i + 3;
}
void print_message()//可以调用printstar
{
printf("how do you don");
printstar(3);
}
func.h
#pragma once #include//头文件放的是函数声明 int printstar(int i);//函数声明 void print_message();//函数声明
*************************** printstar 10 how do you do *************************** printstar 3 *************************** printstar 13 a=13 D:cbook第六章 函数Debug01.函数的嵌套调用.exe (进程 17168)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .2.全局变量
#include#include int i = 10;//全局变量,在函数外定义的变量叫全局变量 int a = 20; void print(int m)//自定义的print函数 { printf("print m = %dn", m); printf("print i = %dn", i); } void printa(int m)//自定义的print函数 { printf("printa m = %dn", m); printf("printa a = %dn", a); } int main() { printf("main i = %dn", i); printf("main a = %dn", a); i = 5; print(i); int a = 2; printa(a); return 0; }
main i = 10 main a = 20 print m = 5 print i = 5 printa m = 2 printa a = 20 D:cbook第六章 函数Debug02.全局变量.exe (进程 1228)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .3.递归调用
#define _CRT_SECURE_NO_WARNINGS #include#include int f(int n) { if (1 == n) { return 1;//一定写结束条件 } return n * f(n - 1);//第一步写好公式 } int step(int n) { if (1 == n) { return 1; } if (2 == n) { return 2; } return step(n - 1) + step(n - 2); } int main() { int n, ret; printf("求n的阶乘:n"); scanf("%d", &n);//请输入数字的大小 ret = f(n); printf("ret=%dn", ret); printf("走楼梯:n"); scanf("%d", &n);//请输入台阶数 ret = step(n); printf("ret=%dn", ret); return 0; }
求n的阶乘: 5 ret=120 走楼梯: 3 ret=3 D:cbook第六章 函数Debug03.递归调用.exe (进程 11808)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
求n的阶乘: 6 ret=720 走楼梯: 5 ret=8 D:cbook第六章 函数Debug03.递归调用.exe (进程 7720)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .4.局部变量与全局变量
main.c
#include "func.h"
extern int k;
void print1()
{
printf("print1 k=%dn", k);
}
int k = 10;//static修饰全局变量,该变量不能被其他文件借用
int main()
{
int i = 10;
{
int j = 5;
}//局部变量的有效范围是离自己最近的花括号
printf("i=%d,k=%dn", i, k);
print1();
print();
return 0;
}
func.c
#include "func.h"
extern int k;//借用main.c文件中的全局变量k
//static修饰函数,函数只能在本函数、本文件内使用
void print()
{
static int t = 0;//只初始化一次
t++;
printf("print execute %dn", t);
printf("print k=%dn", k);
}
func.h
#pragma once #include#include void print();
i=10,k=10 print1 k=10 print execute 1 print k=10 D:cbook第六章 函数Debug04.局部变量与全局变量.exe (进程 12144)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .5.指针的传递题目
#define _CRT_SECURE_NO_WARNINGS #includevoid change(int *p)//相当于p=&i,*p=*&i等价于i { *p = *p / 2; } int main() { int i; scanf("%d", &i); change(&i); printf("%dn", i); return 0; }
10 5 D:cbook第六章 函数Debug05.指针的传递题目.exe (进程 16672)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
7 3 D:cbook第六章 函数Debug05.指针的传递题目.exe (进程 18776)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .6.malloc的使用题目
#define _CRT_SECURE_NO_WARNINGS #include//malloc可以帮我们实现动态数组 int main() { char* p; int n;//储存申请多少个字节的空间大小 scanf("%d", &n); p = (char*)malloc(n);//malloc申请空间的单位是字节 char c; scanf("%c", &c);//注意在scanf和gets中间使用scanf("%c",&c),去除换行 //gets(p);//如果不通过上面的scanf去消除n,gets不会卡住 fgets(p, n, stdin); puts(p); return 0; }
10 hello hello D:cbook第六章 函数Debug06.malloc的使用题目.exe (进程 11668)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .7.走台阶问题
#define _CRT_SECURE_NO_WARNINGS #include//递归调用 //递归的判断条件一定是写到递归公式之前的 int step(int m) { //递归的结束条件 if (1 == m || 2 == m) { return m; } //写递归公式 return step(m - 1) + step(m - 2); } int main() { int n;//存储台阶 scanf("%d", &n); int result = step(n); printf("走到第%d个台阶有%d种走法n", n, result); return 0; }
5 走到第5个台阶有8种走法 D:cbook第六章 函数Debug07.走台阶问题.exe (进程 4260)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .七、结构体 1.结构体
#define _CRT_SECURE_NO_WARNINGS #include#include //结构体所占用空间是68个字节,因为存在对齐,对齐的目的是 //为了提高cpu访问内存的效率 //先声明一个结构体类型 struct student { int num;//num是结构体成员 char name[20]; char sex; int age; float score; char addr[30]; };//结构体类型声明,注意最后一定要加分号 int main() { //后定义变量名 //struct student student1, student2; struct student s = { 1001,"lele",'M',20,85.4,"Shenzhen" };//定义及初始化 struct student sarr[3]; int i; //sarr[0].num = 1002; //sarr->num = 1003; printf("%d %s %c %d %5.2f %sn", s.num, s.name, s.sex, s.age, s.score, s.addr); for (i = 0; i < 3; i++) { scanf("%d%s %c%d%f%s", &sarr[i].num, &sarr[i].name, &sarr[i].sex, &sarr[i].age, &sarr[i].score, &sarr[i].addr); } for (i = 0; i < 3; i++) { //printf("%d %s %c %d %5.2f %sn", sarr[i].num, sarr[i].name, sarr[i].sex,sarr[i].age, sarr[i].score, sarr[i].addr); printf("输出 sarr[%d] = {%d,%s,%c,%d,%5.2f,%s}n", i, sarr[i].num, sarr[i].name, sarr[i].sex, sarr[i].age, sarr[i].score, sarr[i].addr); } return 0; }
1001 lele M 20 85.40 Shenzhen
1002 lily M 20 85.40 Shenzhen
1003 Marry M 25 95.30 Guangzhou
1004 hehe M 18 92.50 Xiamen
输出 sarr[0] = {1002,lily,M,20,85.40,Shenzhen}
输出 sarr[1] = {1003,Marry,M,25,95.30,Guangzhou}
输出 sarr[2] = {1004,hehe,M,18,92.50,Xiamen}
D:cbook第七章 结构体Debug01.结构体.exe (进程 11504)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
2.结构体指针
#define _CRT_SECURE_NO_WARNINGS #include#include //结构体指针 struct student { int num; char name[20]; char sex; }; int main() { struct student s = { 1001,"lidongmei",'M' }; struct student* p;//定义结构体指针 int num, i; p = &s; printf("%d %s %cn", p->num, p->name, p->sex);//结构体变量成员选择,方式一 printf("%d %s %cn", (*p).num, (*p).name, (*p).sex);//指针的成员选择,方式二 //结构体数组初始化 struct student sarr[3] = { 1001,"lilei",'M',1005,"zhangsan",'M', 1007,"lisi",'M', }; p = sarr; printf("-----------------------------n"); num = p->num++;//num=p->num;p->num++ 1002 printf("num=%d,p->num=%dn", num, p->num);//1001,1002 for (i = 0; i < 3; i++) { printf("输出 sarr[%d] = {%d,%s,%c}n", i, sarr[i].num, sarr[i].name, sarr[i].sex); } num = p++->num;//num=p->num;p++ 1005 printf("num=%d,p->num=%dn", num, p->num);//1002,1005 for (i = 0; i < 3; i++) { printf("输出 sarr[%d] = {%d,%s,%c}n", i, sarr[i].num, sarr[i].name, sarr[i].sex); } return 0; }
1001 lidongmei M
1001 lidongmei M
-----------------------------
num=1001,p->num=1002
输出 sarr[0] = {1002,lilei,M}
输出 sarr[1] = {1005,zhangsan,M}
输出 sarr[2] = {1007,lisi,M}
num=1002,p->num=1005
输出 sarr[0] = {1002,lilei,M}
输出 sarr[1] = {1005,zhangsan,M}
输出 sarr[2] = {1007,lisi,M}
D:cbook第七章 结构体Debug02.结构体指针.exe (进程 18136)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
3.typedef的使用
#define _CRT_SECURE_NO_WARNINGS #include#include //给结构体类型起别名,叫stu,起了结构体指针类型的别名,叫pstu typedef struct student { int num; char name[20]; char sex; }stu,* pstu;//pstu等价于struct student * typedef int INTEGER;//为什么要对int起别名,为了实现代码即注释 int main() { stu s = { 1001,"lidongmei",'M' }; pstu p;//stu* p1,那么p1也是一个结构体指针 INTEGER i = 10; p = &s; printf("i=%d,p->num=%dn", i, p->num); return 0; }
i=10,p->num=1001 D:cbook第七章 结构体Debug03.typedef的使用.exe (进程 6604)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .4.C++的引用
main.cpp
#include#include //把&符号写到形参的位置是C++的语法,称为引用,这个时候操作b和在主函数里边使用a等价的 void modify_num(int &b) { ++b; } void modify_pointer(int *&q)//在子函数操作q和主函数操作q手法一致 { //不能将“void *”类型的值分配到"int *”类型的实体 //说明要进行强制类型转换 q = (int*)malloc(20); q[0] = 5; } //C++ int main() { int a = 10; modify_num(a); printf("a=%dn", a); int *p = NULL; modify_pointer(p); printf("p[0]=%dn", p[0]); return 0; }
a=11 p[0]=5 D:cbook第七章 结构体Debug04.C++的引用.exe (进程 19748)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .



