C语言函数的使用

一 函数概述

一堆代码的集合,用一个标签去描述它

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

C语言函数的使用的相关文章

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

c 语言 函数的整理 百度脑图版本

下面整理一下C语言函数的知识点 :使用百度脑图进行整理,详情请看上传的图片: 版权声明:本文为博主原创文章,未经博主允许不得转载.

汇编1 ----C语言函数1

构造以下C程序并在合适位置插入breakpoints 在Visual Studio 2015 CTP6对其反汇编. 下面来分析 z = add(1, 2); 009C170E 6A 02 push 2 ????int z; ????z = add(1, 2); 009C1710 6A 01 push 1 009C1712 E8 8D FA FF FF call 009C11A4 009C1717 83 C4 08 add esp,8 009C171A 89 45 F8 mov dword ptr

(转)如何编写有多个返回值的C语言函数

1引言    笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数.编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题.有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值:或者把需要返回多个值的一个函数分开几个函数去实现多个值的返回.这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑

Linux汇编GAS调用C语言函数实例

Blum的书上只讲了C语言调用汇编,没讲汇编调用C语言.我自己尝试了下. 最终试验成功了,在此写出与大家分享.期间历经无数错误,无数异常,我不是醉了,而是跪了...好在最后好了. 程序实现一个换值功能,在main.s里定义a=10,b=20,然后调用C语言函数把a,b换值. 新建两个文件分别为main.s的汇编文件,还有pro.c的C语言函数文件. main.s的代码如下: .section .data a: .int 10 b: .int 20 .section .text .globl ma

C语言函数sscanf()的用法 (转载

在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)

C语言函数sscanf()的用法(转)

转自:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf

[整理]C语言函数说明和定义

函数的一般形式是:type-specifier function_name(parameter list) parameter declarations{   body of the function} 1.类型说明符定义了函数中return语句返回值的类型,该返回值可以是任何有效类型.假如没有类型说明符出现,函数返回一个整型值. 当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数. 当有必要返回其它类型数据时,需要分两

从linux0.11中起动部分代码看汇编调用c语言函数

上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一段代码(linux0.11的启动分析部分会在另一部分中再分析,由于此文仅涉及c与汇编代码的问题,). after_page_tables: pushl $0 # These are the parameters to main :-) pushl $0 pushl $0 pushl $L6 # re

借助动态代码生成技术在基于Webkit引擎的HTML5网页JS内调用易语言函数

作者:庄晓立(Liigo) 日期:2015年3月3日夜 原创链接:http://blog.csdn.net/liigo/article/details/44045177 版权所有,转载请注明出处:http://blog.csdn.net/liigo 前两天我协助解决了一个技术问题,在此稍作记录和总结. 具体来说,就是在使用基于Webkit引擎的封装组件wke的过程中,需要把一个易语言函数注册给JavaScript引擎,让它可以在网页里被调用(就像在网页里调用普通JavaScript函数一样).如