- strcmp函数:依次比较字符数组中的每一个元素,数组可隐式转换为指针,因此该函数的参数可用数组表示
若第一个参数字符小于第二个参数字符,则返回<0
若第一个参数字符大于第二个参数字符,则返回>0
若两个字符串相等,则返回0
-
字符大小比较(字典序):
依次取两个字符串的对应字符,若两个字符能区分出大小,则字符串也可区分出大小;若两个字符不能区分大小,则 依次取下一字符进行比较
- 函数的形参是实参的副本
实参复制后,副本变为了形参,对形参的改变并不影响实参。
eg:
#include <stdio.h>
#include <stdlib.h>
void Swap(int x, int y){
int tmp;
tmp = x;
x = y;
y = tmp;
printf("a=%d 地址为%p\nb=%d 地址为%p\n", x, &x, y, &y);
}
int main(){
int a = 10;
int b = 20;
Swap(a, b);
printf("a=%d 地址为%p\nb=%d 地址为%p\n", a, &a, b, &b);
system("pause");
return 0;
}
由运行结果可知,形参和实参的地址不同,因此swap函数无法交换a、b。
改正后:
#include <stdio.h>
#include <stdlib.h>
void Swap(int* x, int* y){ //x变量类型为int型指针
int tmp;
tmp = *x; //解引用
*x = *y;
*y = tmp;
printf("a=%X \nb=%X\n", x, y);
}
int main(){
int a = 10;
int b = 20;
Swap(&a, &b);
printf("a=%d 地址为%p\nb=%d 地址为%p\n", a, &a, b, &b);
system("pause");
return 0;
}
解引用:根据内存地址,获取到地址中的数据内容
x,y中存放的是a,b的地址
- 输出型参数
一个函数想返回多个值,配合输出型参数,完成多个参数的返回
示例代码:
#include <stdio.h>
#include <stdlib.h>
int Divide(int x, int y, int* success){
if (y == 0){
success = 0;
return 0;
}
success = 1;
return x/y;
}
int main(){
int success=0;
int ret = Divide(10, 5, &success);
printf("ret=%d,success=%d\n", ret,success);
system("pause");
return 0;
}
- 嵌套调用:函数中调用其他函数
- 链式访问:一个函数的返回值作为另一个函数的参数
- 将函数声明写在头文件中,将函数定义写在一个.c文件中,则可在其他.c文件中调用该函数
//""表示从当前工程的目录中查找头文件
#include "test.h"
//<>表示从系统目录中查找头文件
#include <stdio.h>
函数可以声明多次,但只能定义一次
C语言中的头文件,只能被包含一次
- 通过预编译指令完成头文件只包含一次的控制
#ifndef __TEST__ //如果没定义
#define __TEST__ //定义
void Func(int x);
#endif
或者写成:
#pragma once
void Func(int x);
- 函数递归
函数调用自身,函数A调用完函数B之后,会在之前的调用位置继续往下执行代码
解决问题,往往既可以使用递归方式,也可使用循环的方式。递归方式,代码通常更直观更简单,但运行效率可能会较低;循环方式,代码通常更繁琐,但是运行效率可能会较高
练习:接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void Print(int x){
if (x > 9){ //x不是个位数
Print( x / 10);
}
printf("%d ", x % 10);
}
int main(){
int i;
printf("请输入一个数:\n");
scanf("%d", &i);
Print(i);
printf("\n");
system("pause");
return 0;
}