1:函数的定义以及调用和传参
1.1定义格式
存储类型 数据类型 函数名(数据类型 形参1, 数据类型 形参2,...)
{
函数体;
}
1.2:函数调用:
void fun(int a,int b)
{
printf("%d\n",a+b);
}
int add1(int a,int b)
{
return a+b;
}
int add(int a,int b)
{
int num=0;
num=a+b;
return num;
}
int main(int argc, char const *argv[])
{
fun(1,2);
int sum=add1(5,2);
printf("%d\n",sum);
int n=add(3,4);
printf("%d\n",n);
return 0;
}
5.3:参数传递
值传递
单向传递,将实参这个数据传递给形参使用,函数内改变形参函数外的实参不会受影响,因为他们是属于不同的空间。
地址传递
双向传递,在函数内通过传递的地址修改地址所指空间中的内容,实参会随之变化。
#include <stdio.h>
void fun(int *a, int *b) //a=&n1 b=&n2
{
(*a)++; //*a =*&n1 = n1
(*b)++; //*b = *&n2 = n2
printf("in fun: %d %d\n", *a, *b); //11 31
}
int main(int argc, char const *argv[])
{
int n1 = 10, n2 = 30;
fun(&n1, &n2); //n1=11 n2=31
printf("in main: %d %d\n", n1, n2); //11 31
return 0;
}
和地址传递一样,参数中存在地址,也就是指针。
#include<stdio.h>
void yue(int *p,int n)//相当于p等于a
{
p[2]=100;
for(int i=0;i<5;i++)
printf("%d",p[i]);
printf("\n");
}
int main()
{
int a[5]={1,2,3,4,5};
yue(a,5);
printf("%d\n",a[2]);//由于前面的函数调用了一次,所以a[2]的值发生了改变
}
栈区与堆区
2.1栈区
2.2:堆区
堆区空间的开辟:malloc函数
代码格式:
数据类型 *指针名 = (数据类型 *)malloc(n*sizeof(数据类型));
int *p=(int *)malloc(4*sizeof(int));
注释:开辟的空间使用后需要及时释放(free(指针名))
解决方案:
1:值传递
char *fun()
{
char *p = (char *)malloc(32);
strcpy(p, "hello");
return p;
}
int main(int argc, char const *argv[])
{
char *q = fun(); //q接收了函数的返回值也就是p保存的堆区地址
printf("%s\n", q);
free(q);
return 0;
}
2:参数传递
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fun(char **p) //p=&q,二级指针指向函数调用中传递的地址
{
*p = (char *)malloc(32); //*p = *&q =q
strcpy(*p, "hello");
}
int main(int argc, char const *argv[])
{
char *q = NULL;
fun(&q); //&q类型是char **
printf("%s\n", q);
free(q);
3:string函数族
man查看相关手册
1:strcpy(将字符串复制,包括\0)
char *strcpy(char *dest, const char *src);
功能:把整个字符串复制,包括\0。
参数: char *dest :目标字符串首地址
const char *src:源字符串首地址
2:strcat(字符串的拼接)
char *strcat(char *dest, const char *src);
功能:用于字符串拼接
参数:
char *dest:目标字符串首地址
const char *src: 源字符串首地址
3:strlen函数:计算字符串长度,只能用于char类型
4:strcmp:
int strcmp(const char *s1, const char *s2);
功能:用于字符串比较
参数:s1 s2用于比较多字符串
返回值:
从字符串首个字符开始比较字符ASCII的大小,如果相等继续向后判断。
正数: s1>s2
0 : s1== s2
负数: s1<s2