一 函数概述
一堆代码的集合,用一个标签去描述它
1、函数名 (地址)
2、输入参数
3、返回值
在定义函数时,必须将3要素告知编译器。
注意:指针保存函数 int (*p)(int,int,char);
二 输入参数
1>值传递
上层调用者 保护自己空间值不被修改的能力
void fun(int a) { a = xx; a = sha md5 yy } int main() { int a = 20; fun(a); printf --》 a = 20; }
2>地址传递
上层,调用者让下层子函数修改自己空间值的方式
类似结构体这样的空间,函数与函数之间调用关系--->连续空间的传递
void fun1(char *p) { p[1] = ‘2‘; } int main() { char buf[] = "hello"; //数组就是一个指针地址标识 fun1(buf); printf("%s \n",buf); }
1)空间的读写
void fun(char *p); 该空间可能修改 void fun(const char *p); 只读空间,为了空间看看
3>连续空间的传递
1)字符空间
1,strlen int strlen(const char *p) { int i = 0; /*错误处理,判读输入参数是否合法*/ if(p == NULL){ // return ... } /*内存处理,从头到尾逐一处理*/ while(p[i]){ //+++++++++++ i++; } } 2,strcpy void strcpy(char *dest,const char *src); " " ---> 初始化const char * char buf[10] ---> 初始化char *
2)非字符空间
int fun(void *buf,int len) { unsigned char *tmp = (unsigned char *)buf; for(i = 0, i < len, i++) { tmp[i] } }
三 返回值
1>基本语法
调用者: a = fun(); 被调者: int fun() { return num; }
返回类型
基本数据 、 指针类型(空间)、数组(X)
2>返回基本数据类型
注意,返回值也可以是结构体,因为结构体也是基本数据类型。但是我们要声明一个变量来接受返回值,所以需要新开辟内容,而结构体太庞大,影响性能
int *fun1(void); //我们需要返回多个值,但无法声明多个返回值,所以我们能返回指针。 int main() { int *p; //用相同类型的指针去接收函数的返回值--返回指针地址 p = fun1(); }
3>返回连续空间类型
指针作为空间返回的唯一数据类型
地址:指向的合法性
作为函数的设计者,必须保证函数返回的地址所指向的空间是合法。【不是局部变量】
不能返回局部变量,因为即使将指针赋值给了局部变量,但局部变量一离开函数就会被释放,以下是3种常用方法,去返回指针
char *fun4(void) { char buf[] = "hello"; return buf; } int main(int argc, const char * argv[]) { @autoreleasepool { char *pp = fun4(); printf("==%s",pp); //输出结果为 == ,无hello } return 0; }
1)静态区
局部变量前加上 static 变成静态区全局变量
2)只读区
局部变量加上const,很少用,没太大意义
3)malloc
char *fun3(void) { char *s = (char *)malloc(100*sizeof(char)); strcpy(s, "hello world"); //拷贝过去 return s; } int main(int argc, const char * argv[]) { @autoreleasepool { char *p; p = fun3(); printf("the p is %s \n",p); free(p);//用完要记得释放 } return 0; }
时间: 2024-09-29 09:17:01