以下为原文效果好一些 - -
C语言学习笔记(函数) - Muxxs学习世界note.muxxs.com
函数
函数类型 函数名(参数类型 参数名)
- 函数类型<->return的类型
- 函数若不返回,函数类型为void
- 若无参数,参数名处为void
- 若函数在被调用处之后,应先声明函数
1.嵌套调用
int main(){
print("%d",max(1,2,3,4)); //起点
return 0;
}
int max4(int a,int b,int c,int d){
int max2(int a,int b); //->此处max2在max4后面,需要声明
m=max2(a,b);
m=max2(m,c);
m=max2(m,d);
return m;
}
int max2(int a,int b){
if (a>b){
return a;
}else{
return b;
}
}
2.递归调用
我调用我自己这种情况下每次循环都会被暂存到内存中,空间复杂度较大
int f(int x){
int y,z;
printf(x);
z=f(y);
return (2*z);
}
比如这个,会自己调用自己
st=>start: Start
op1=>operation: f ( x )
e=>operation: Operation
st->op1->e->op1
无 限 套 娃 3.数组作为函数参数
Example:
int max(x[10])
也可以不指定数组的大小
int max(x[])
多维数组 类比上面
int max(x[][3])
4.局部变量和全局变量
局部变量:
函数体内定义的变量
Example:
float f1(int a){
int b,c; -> b和c为局部变量
...
}
全局变量:
函数体外定义的变量
Example:
int d=10; //d->全局变量
float f1(int a){
int b,c; //-> b和c为局部变量
...
}
5. 变量的存储方式和生存期
digraph main{
用户区->程序区
用户区->静态存储区
用户区->动态存储区
动态存储区->形参
动态存储区->没用static声明的变量
动态存储区->函数调用时的现场保护和返回地址
}
digraph main{
变量和函数 -> 数据类型
变量和函数 -> 数据的存储类别
数据的存储类别 -> 静态存储
数据的存储类别 -> 动态存储
}
1. 局部变量的存储类别 * 自动变量
auto 变量类型 变量名;
**不写auto则隐含指定为“自动存储类别”**
调用时系统分配存储空间,调用结束时释放空间
- 静态局部变量(static 局部变量)
静态局部变量在调用后不释放,仍保留原来的值 一直保留到程序运行结束 下次static的时候不赋值,保留上次的值static 变量类型 变量名
- 寄存器变量(register 变量)
这种变量是存储在寄存器当中的(速度比较快,但是不知道为啥不用了)register 变量类型 变量名
- 一个文件内扩展外部变量作用域 & 将外部变量的作用域扩展到其他文件
扩展后可正常使用extern 变量名
- 将外部变量作用域限制在本文件中
static 变量类型 变量名
```dot digraph main{ 按照作用域 -> 局部变量 按照作用域 -> 全局变量 局部变量 -> 自动变量 局部变量 -> 静态局部变量 局部变量 -> 寄存器变量 全局变量 -> 静态外部变量 全局变量 -> 外部变量 }定义字符数组
char 变量[常量表达式];
字符型数据以ASCII 码的形式存储在数组中
字符数组的初始化
用初始化列表的方法
char c[3]={'O',"K","!"};
结构如下⬇️ | c[0] | c[1] | c[2] | | ---- | ---- | ---- | | O | K | ! |
也可以用这种方便的方法⬇️char c[]={"OK!"};
结构如下⬇️ | c[0] | c[1] | c[2] | c[c] | | ---- | ---- | ---- | ---- | | O | K | ! | 0 |
这种会多一个0在结尾,表示这是一个字符串引用字符数组中的元素
Example:
printf("%c",c[1]);
字符数组的输入输出
char c[]={"China"};
- 可以用循环 print("%c",c[n]) 输出
- 可以用 print("%s",c) 直接输出字符串
字符串处理函数
- puts函数
puts(字符数组)
Example:
puts(c);
-> China
- gets函数
gets(字符数组)
Example:
gets(c);
将获得的数据赋值给c
- strcat函数
字符串连接函数
strcat(字符数组1,字符数组2)
char str1[]={"China is"}; char str2[]={" a good country"}; printf("%sn",strcat(str1,str2));
res -> China is a good country
- strcpy和strncpy函数
字符串复制函数
strcpy(字符数组1,字符串2)
将字符串2 赋值--> 字符数组1
Example:
char str1[10],str2[]={"china"}; strcpy(str1,str2);
str1的状态为: | | | | | | | | | | | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | c | h | i | n | a | 0 | 0 | 0 | 0 | 0 |
strncpy(字符数组1,字符串2,字符数)
Example:
char str1[10],str2[]={"china"}; strncpy(str1,str2,2);
str1的状态为: | | | | | | | | | | | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | c | h | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 字符串比较函数
strcmp(字符串1,字符串2)
比较字符串1和字符串2,自左至右逐个字符比较,直到出现不同的字符或出现
此时比较不同的这对字符的大小。
| 字符相同 | 字符串1>字符串2 | 字符串2>字符串1 | | -------- | --------------- | --------------- | | 0 | 正整数 | 负整数 |
- 字符串测长度函数
strlen(字符数组)
返回字符数组实际值的长度
(不包括 0 )