学习目标:
- 掌握 C 入门知识
- 学习自律+1 +1 +1 +1…+1
学习内容:
- goto语句
- 函数:(1) 函数的参数(2) 函数的调用
一.goto语句
goto语句:终止程序在某些深度嵌套的结构的处理过程(可以跳转)
1.代码示例:
#include<stdio.h>
int main()
{
again:
printf("hello\n");
printf("hello\n");
printf("hihi\n");
goto again;
return 0;
}
- 用goto语句实现一个关机程序
程序运行起来后,倒计时60秒关机,如果输入好好学习就可以取消关机。
使用命令行关机
shutdown -s -t 关机
shutdown -a 取消关机
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char arr[20] = { 0 };
system("shutdown - s - t 60");
again:
printf("请注意,你的电脑将在一分钟内关机,如果输入:好好学习,就取消关机\n");
scanf("%s", arr);
if (strcmp(arr, "好好学习")==0)
{
system("shutdown - a");
}
else
{
goto again;
}
return 0;
}
C语言strcmp()函数:比较两个字符串。两个字符串相等时返回0.
所以可以写成strcmp(arr, “好好学习”) == 0
二.掌握 函数 基本语法
- 函数是什么
(1).函数就是 C 语言的模块,一块一块的,有较强的独立性,可以相互调用,换句话说,C 语言中,一个函数里面可以调用 n 个函数,即大函数调用小函数,小函数又调用“小小”函数。这就是结构化程序设计,所以面向过程的语言又叫结构化语言。
(2).函数就是一系列 C 语句的集合,能完成某个特定的功能。需要该功能的时候直接调用该函数即可,不用每次都堆叠代码。需要修改该功能时,也只需要修改和维护这一个函数即可。
2. 函数的分类
(1).库函数:库函数(Library function)是把函数放到库里,供别人使用的一种方式。一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数。
(2).自定义函数:自定义函数是程序员自己声明和定义的,是程序员补充的工具,不管是现成工具的还是补充的工具,都是工具,对使用者来说都一样,没有区别。在C语言中,函数的调用非常灵活,可以独占一行语句,也可以当成常量赋值给变量,也可以当成函数的参数。
- 库函数
(1)strcpy函数:C 库函数char *strcpy(char *dest, const char *src) 把src 所指向的字符串复制到dest(\0也可以拷贝)。 需要注意的是如果目标数组dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
#include<stdio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "Sample string";
char str2[40];
char str3[40];
strcpy(str2, str1);
strcpy(str3, "copy successful");
printf("str1:%s\nstr2:%s\nstr3:%s\n", str1, str2, str3);
return 0;
}
(2)memset函数:memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。 其原型是:void memset(void _Dst, int _Val, size_t _Size)
_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数。
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "hello world";
memset(str, 'x', 5);
printf("%s\n", str);
return 0;
}
- 自定义函数(有函数名 返回值类型和函数参数)
(1).找出两个整数之间的最大值
#include<stdio.h>
int get_max(int x,int y)
if (x > y)
return x;
else
return y;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = get_max(a, b);//自定义函数
printf("%d\n", m);
return 0;
}
并不是说函数都有返回,有的不用返回可以写成void get_max()
以上get_max就是一个自定义函数
- 函数的参数
(1).函数的实参:
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
实参可以是变量 常量 表达式 函数等;
#include<stdio.h>
get_max(int x,int y)
{
if (x > y)
return x;
else
return y;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//int m = get_max(a, b);//变量
//int m = get_max(a, 3);//常量
//int m = get_max(a, 2+3);//表达式
int m = get_max(a, get_max(4, 5));//函数
printf("%d\n", m);
return 0;
}
(2).函数的形参:
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
形式参数当函数调用完之后就自动销毁了
(3):示例:写一个函数可以交换两个整形的变量内容
由图片可知,最后a和b的值并没有交换,这是为什么呢?
a,b是实参;x,y是形参形参是实参的一份临时拷贝,对形参的修改是不会影响实参的
通过调试可以知道,当a,b传参过去给x,y但是x,y的地址和a,b并不相同,所以交换后交换的只是x,y的值对a,b并无影响
所以可以采用指针的方式*
6. 函数的调用
(1).传值调用:
传值调用: 函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参
#include<stdio.h>
void Swap1(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a=%d,b=%d\n", a, b);
Swap1(a, b);
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
(2).传址调用:
将实参的地址传递给函数,在函数内对形参进行操作等同于对实参进行相同的操作,在函数调用结束返回后,形参被释放,实参的内容是对形参进行操作后的结果。
#include<stdio.h>
void Swap2(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a=%d,b=%d\n", a, b);
Swap2(&a, &b);
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
(3).注意
下图这种方式也是一种传值方式,虽然地址传过去是对的但是px,py交换的只是地址,a,b的值并无影响。
学习产出:
- 技术笔记 2 遍
- CSDN 技术博客 1 篇