函数:
函数是一串语句,这些语句组合起来,并被指定了一个名字。
有返回值,形参
函数的声明和定义
调用函数之前必须先声明或定义
隐式声明: int 函数名(根据实参推断)
float/double :double
char/short/int :int
包含头文件主要目的是声明函数
函数的定义:
函数不能返回数组,除此之外没有其他限制。
指定返回类型是void代表 函数没有返回值。
如果函数没有返回值,在c89中默认是int,c99中不合法。
函数体内可以出现变量声明和语句,但在c89中,声明必须在使用之前。
在调用函数之前,函数必须是先声明,或者先定义,否则,c就会处理成隐式声明,
默认的返回值为int。最好避免使用隐式声明。
在c99中,没有隐式声明。
函数声明又叫函数原型。函数声明中的参数名可以不写。
f(x) = 2x + 1;
程序中:给一段代码,起了个名字,叫函数。
返回值类型(结果) 函数名(参数){
函数体(一段代码)
}
main函数的返回值必须是int,默认为int。
main函数可以递归调用,只是一般不用,成了死循环。
eg: int fa(int x){//形式参数,形参
return x+1;
}
值传递:变量传递。在子函数中重新分配空间
函数的返回值:
根据需求,可以丢弃,保存,参与运算,输出
(如果函数没有返回值 为void 可以直接return 后面不根数字)
默认是int的返回值
函数的参数
空参() 可以传任意参数
void形参 (void) 不允许传任何的参数
有参数 传对应类型的参数,类型会自动转换
程序结束:
函数执行完
遇到return:
void 函数 return;
非void return 表达式;
表达式可以是另一个函数的调用
递归函数:
递归函数一定有一个出口(退出条件)。
每次递归调用,会让解决的问题向已知条件靠近。
1、效率比较低
2、内存消耗大
3、适合于解决特别复杂的问题(这个复杂问题可以逐步件化成简单问题)
字符串函数:
strcpy(char *,const char *)
strncpy(char *,const char *,size_t n)//达到n个或者遇到'\0'结束(有'\0'也会拷贝)
eg:strncpy(str,"abcdef", 6);
strcat(char *,const char *)
strlen(const char *)
strcmp()
> < == 比较的是地址
string.h
strcpy://'\0'也会拷贝
strncpy(char *,const char *,int n)//拷贝n个字符,不算'\0',需要自己添加'\0'
strcat:连接
strcmp
strlen:计算字符串的长度,不计算'\0'
b = a;//OK
a = b;//WARNING
strcpy(char*, const char*)
strncpy(char*, const char*, size_t n)
strncpy(str, "abcdef", 10);
char str[10];
strncpy(str, "123456789", 10);
strcat
strlen
strcmp
> < == 地址
str1 == str2 1
strcmp(str1, str2) 0
//栈
char ss[2][4] = {"abc", "def"};
strcpy(ss[0],"abc");//OK
ss[0] = "aaa";//ERROR
//数组本身在栈,字符串本身在代码区
char* ss[3] = {"aaa", "bbb", "ccc"};
strcpy(ss[0], "abc");//ERROR
ss[0] = "ABC";//OK