一.常见库函数
附上库函数参考网址:https://cplusplus.com/
pow
base——底数,exponent——阶层,可以算整型也可以算浮点型,但返回值是浮点型。
如果不想看到编译器警告可以强制转换一下。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <math.h> //次方函数 int main() { int ret = (int)pow(2, 3); printf("%d", ret); return 0; }
strcpy
把source指向的字符串放到destination中去。
char*实际上就是地址,目的地的地址与源头的地址。在数组中数组名就可以代表地址。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> int main() { char arr[10] = { "abc" }; char arr1[10] = { 0 }; strcpy(arr1, arr); printf("%s", arr1); return 0; }
小问题:那么字符串的结束标志“\n”是否也会复制呢?
通过调试可以知道,“\n”也会被复制。
memset
*ptr指向内部储存空间,num个字节内容设置成value值。
#include <stdio.h> #include <string.h> int main() { char arr[] = "hello c"; memset(arr, 'c', 5); printf("%s", arr); return 0; }
二.函数交换举例
void Swap1(int x, int y) { int z = 0; z = x; x = y; y = z; } 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("交换后:num1 = %d num2 = %d\n", num1, num2); return 0; }
函数调用的时候,将实参传递给形参
形参其实是实参的一份临时拷贝
对形参的修改,不会改变实参
这里会发现按照正常的逻辑来讲是可以交换的,但是一用函数又不能交换了。
这里我们通过窗口监视看一下。
我们可以看到实参传给形参的数值确实通过了,不同的是它们的地址。
接着发现里面的x,y发生了交换,但这个没有影响到外面的实参。
它们是完全独立的空间。
接下来我们来试试传递地址。
void Swap2(int*p1, int*p2) { int tmp = 0; tmp = *p1;//tmp = num1; *p1 = *p2;//num1 = num2; *p2 = tmp;//num2 = tmp; } int main() { int num1 = 0; int num2 = 0; scanf("%d %d", &num1, &num2); printf("交换前:num1 = %d num2 = %d\n", num1, num2); //实际参数 Swap2(&num1, &num2); printf("交换后:num1 = %d num2 = %d\n", num1, num2); return 0; }
成功交换。而这里面的原理如下图所示:
因为传递的是地址,所以在函数中的p1与p2与实参num1,num2联系着,一旦它们数值发生变化,那么因为有着对应的地址,所以num1,num2也会跟着变化,从而实现交换。
定义补充: