【C语言】基础篇二、函数

您所在的位置:网站首页 c语言中isupper什么意思 【C语言】基础篇二、函数

【C语言】基础篇二、函数

2023-07-10 13:25| 来源: 网络整理| 查看: 265

函数是什么

维基百科中对函数的定义:子程序

在计算机科学中,子程序,是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责

完成某项特定任务,而且相较于其他代码,具备相对的独立性

一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库 C语言函数的分类 库函数自定义函数 库函数

如:printf、scanf、strlen、strcmp、rand、srand、time

C语言并不直接实现库函数,而是提供了C语言的标准和库函数的规定(功能、名称、参数、返回值、返回类型…),库函数的实现一般是由编译器实现的

把常用的一些功能实现成函数,集成为库,由C语言直接提供,支持可移植性和提高程序的效率

使用库函数必须包含对应的头文件**#include **

库函数查询:

cplusplus.com(旧版)推荐

MSDN (Microsoft Developer Network)

MSDN离线版(使用索引而不是搜索)

https://en.cppreference.com(英文版)

https://zh.cppreference.com(中文版,翻译比较准确但不够直观,搜索功能使用的是谷歌)

C语言常用库函数:

IO函数(输入输出函数:scanf、printf、getchar、putchar、…)字符串操作函数(strlen、strcmp、…)字符操作函数(islower(判断某个字符是否为小写)、isupper(判断某个字符是否为大写)、…)内存操作函数(memset、memcmp、…)时间/日期函数(time、…)数学函数(sqrt(求平方根)、pow(求指定次方)、…)其他库函数 strcpy

string copy——字符串拷贝

char * strcpy (char * destination, const char * source);

把str1拷贝到str2中:

#define _CRT_SECURE_NO_WARNINGS 1 #include #include int main() { char str1[4] = { 'a', '\0', 'b', '\0' };//'a' '\0' 'b' '\0' char str2[5] = "xxxx";//'x' 'x' 'x' 'x' '\0' strcpy(str2, str1);//左粘贴,右复制, printf("%s\n", str2);//只打印a,因为修改后str2的元素为'a' '\0' 'x' 'x' '\0' return 0; }

结论:str1从起始字符开始,直到第一个'\0'会被拷贝到str2中,其余元素不发生拷贝

memset

memory set——内存设置(内存块填充)

void * memset (void * ptr, int value, size_t num);

sizeof返回的值的类型是size_t,size_t就是专门为sizeof创建的,其本质就是unsigned int(无符号整型),因为其求大小不可能求出负数

#define _CRT_SECURE_NO_WARNINGS 1 #include #include //memset int main() { char str[] = "hello bit"; memset(str, 'x', 5);//单位字节 memset(str + 6, 'x', 3);//从中间开始填充 printf("%s", str);//xxxxx xxx return 0; } 自定义函数

自定义函数和库函数一样,有返回值类型、函数名、函数参数、函数体,但这些都是自己设置并实现的

求最大值 #define _CRT_SECURE_NO_WARNINGS 1 #include int get_max(int x, int y) { return (x > y) ? (x) : (y); } int main() { int num1 = 0; int num2 = 0; scanf("%d %d", &num1, &num2); int max = get_max(num1, num2); printf("max = %d\n", max); return 0; } 整型变量交换 #define _CRT_SECURE_NO_WARNINGS 1 #include //错误版本 void swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } //正确版本 void swap2(int* px, int* py) { int tmp = 0; tmp = *px; *px = *py; *py = tmp; } int main() { int num1 = 0; int num2 = 0; scanf("%d %d", &num1, &num2); printf("交换前::num1 = %d num2 = %d\n", num1, num2); swap1(num1, num2); printf("Swap1交换后::num1 = %d num2 = %d\n", num1, num2);//失败 swap2(&num1, &num2); printf("Swap2交换后::num1 = %d num2 = %d", num1, num2);//成功 //或用指针变量存放num1、num2地址然后传参 int* p1 = &num1; int* p2 = &num2; swap2(p1, p2);//传的是p1、p2的内容,不是地址! return 0; } 函数参数 形参、实参

num1、num2叫实际参数(实参),是真实传给函数的参数,可以是变量、常量、表达式等,但一定要有一个确定的值传给形参;

x、y叫形式参数(形参),是指函数名后括号中的变量,只有在函数被调用的过程中才实例化(被创建,分配内存单元),函数调用完成之后自动销毁,因此形式参数只在函数内有效,对形参的修改不会影响到实参,只有通过指针让实参与形参建立联系才能影响到实参

当实参传给形参时,形参实例化之后其实相当于实参的一份临时拷贝

指针变量存放一个地址,它本身也有一个地址

函数调用

本质上都是传值

传值调用

即上述swap1

函数的形参和实参分别占有不同内存块(传址调用也是),形参是实参的一份临时拷贝,对形参的修改不会影响实参

传址调用

即上述swap2

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量

练习

TDD(Test-Driven Development,测试驱动开发)思想:

先思考如何使用函数再考虑如何实现函数 素数判断 #define _CRT_SECURE_NO_WARNINGS 1 #include #include int is_prime(int num)//素数判断函数:是合数返回0,是素数返回1 { int i = 0; if (1 >= num)//过滤负数、0、1 { return 0; } if (2 == num)//放行2 { return 1; } for (i = 2; i upper_limit)//输入合法性判断 { printf("输入错误:下限超过上限\n"); return 0; } for (num = lower_limit; num


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3