标签:
一堆代码的集合,用一个标签去描述它
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;
}
标签:
原文地址:http://my.oschina.net/u/2346786/blog/497104