精华内容
下载资源
问答
  • C语言函数

    万次阅读 多人点赞 2019-08-03 19:54:19
    即主函数main(),如果程序的任务比较简单,全部的代码都写在main()函数中,但是,在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大臃肿,结构复杂,代码重复。...

     

    函数的概念

           每个C程序都至少有一个函数,即主函数 main() ,如果程序的任务比较简单,全部的代码都写在main()函数中,但是,在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大臃肿,结构复杂,代码重复。

           我们可以根据程序的逻辑和任务的分工把代码划分到不同的自定义函数中,main()更关心业务逻辑和处理流程,需要执行具体任务的时候,调用这些自定义的函数就可以了。

           为了方使理解,我们把函数分为两种:一种是库函数,一种是自定义函数。

           库函数是C语言提供的,或系统提供的,实现了某些基本的功能,例如scanf、printf,在程序中可以直接使用。

           自定义函数是程序员为了完成某项任务而编写的函数,目的是为了实现某项的功能或让主程序更简洁。程序员在使用自定义函数之前,必须先声明和定义。

    自定义函数的声明

           自定义函数声明就是告诉编译器函数名称及如何调用函数,包括函数返回值的数据类型、函数名称、参数列表。

           有些程序员也将函数声明说成是函数原型,只是用词不同,意思是一样的。

           C语言中的声明函数的语法如下:

           

           返回值的数据类型return_type:函数执行完任务后,可以返回一个值,return_type是函数返回的值的数据类型,可以是int、char、double或其它自定义的数据类型。有些函数只执行任务而不返回值,在这种情况下,return_type用是关键字 void表示。

           无返回值的函数的声明语法如下:

           

           函数名称function_name:函数名称是标识符,命名规则与变量名称的命名规则相同。

           函数的参数列表parameter list:当函数被调用时,调用者需要向函数的参数传递值。参数列表包括参数的类型、顺序。参数列表是可选的,也就是说,函数可以没有参数。

           无参数的函数的声明语法如下:

     

           

           函数声明示例:

     

           

           声明了一个函数,返回值是int类型,函数名是checksc,函数只有一个参数int height,注意,函数的声明语句最后的分号不能少。

           如果把自定义函数比喻成工具,函数的声明就是这个工具的设计图纸。

    自定义函数的定义

           自定义函数是工具,如果想让这个工具能被使用,光有设计图纸还不行,要把工具制造出来,函数的定义就是这个工具的实体,提供了函数的实际主体,为了实现函数的功能,程序员为需要函数编写代码。

           C语言中的函数定义的语法如下:

           

           函数定义的return_type、function_name和parameter list必须与函数声明一致。

           函数主体包含为了完成任务需要执行语句的集合,放在花括号内。

           示例:

           

           注意,不要在函数定义后面加分号,以下是错误的,初学者容易犯这种错误。

           

     

    自定义函数声明和定义的方式

          如果自定义函数只在调用者程序中使用,可以在调用者程序中声明和定义,声明一般为调用者程序的上部,定义一般在调用者程序的下部,这并不是C语言的规定,而是为了让程序更方便阅读,程序员约定的写法。

           自定义函数在调用者程序中声明和定义的示例(book45.c):

           

           在book45.c中,判断超女身材的函数checksc不是公共的功能,只是选秀程序使用,所以声明和定义在book45.c中。

           如果自定义函数是一个公共的功能模块,例如比较两个数的大小,就可以在其它的头文件中声明(如_public.h),调用者程序需要用#include预处理指令包含该函数声明的头文件。

           如果自定义函数是一个公共的功能模块,就可以在其它的程序文件中定义(如_public.c),编译的时候,要把调用者程序和自定义函数的程序文件一起编译。

          在以下的示例中,函数max在_public.h头文件中声明,在_public.c程序文件中定义,在book46.c程序中被调用。

           自定义函数的头文件(_public.h):

           

           自定义函数的程序文件(_public.c):

           

           调用者程序文件(book46.c)

           

           编译命令如下:

           

           注意:

           1)在book46.c的第6行 ,这里包含头文件是用双引号,不是尖括号<>。一般来说 #include <> 用于包含C语言提供的库函数的头文件,#include ""用于包含程序员自定义的头文件。

           2)编译调用者程序的时候,把调用者程序和自定函数的程序文件一起编译。否则编译的时候会出现以下错误。

     

           

          正确的编译指令应该是gcc -o book46 book46.c _public.c

           3)自定义函数的头文件_public.h和_public.c的命名没有规定,由程序员自己命名,就像变量的命名一样,为了增加程序的可读性,尽可能采用一些有意义的名称。

    库函数

           C语言提供了一些已声明和定义的函数,调用这些函数可以完成一些基本的功能,我们把这些函数称为C 标准函数(C standard library),简称库函数,例如printf、scanf、memset、strcpy等。CC语言的库函数有几百个,常用的不过十分之二三,不需要记住,在以后的章节中我将详细介绍一些常用库函数的使用,用多了就熟了。

           C语言标准库函数的声明的头文件存放在/usr/include目录中,如下:

           <asset.h>     <ctype.h>       <errno.h>     <float.h>    <limits.h>

           <locale.h>    <math.h>     <setjmp.h>   <signal.h>     <stdarg.h>

           <stddef.h>   <stdlib.h>   <stdio.h>      <string.h>      <time.h>

           C语言库函数的定义的文件是/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc.a(不同编译器的版本目录名有所不同),这是一个打包好的静态链接库文件,静态链接库的知识我们以后再介绍。

           我们在用gcc编译程序的时候并没有把libgcc.a包含进来,那是因为gcc编译器缺省会包含它,但是,程序员自定义函数的头文件和程序文件就没有这种待遇,需要手工的包含进来。

    需要包含哪些头文件

           我们在使用库函数的时候,如果不包含它的头文件,编译时会出现警告,如下:

           该包含哪些头文件呢?有两种方法,一是上百度上查资料,二是使用Linux系统提供的帮助,以strcpy函数为例,在命令行下输入man strcpy回车,如下:

           

           man显示了函数的声明的头文件(第5行),函数的参数、使用方法和返回值。

           注意了,如果程序中使用的没有包含它头文件的库函数,编译的时候不一定是警告,也可能是报错,函数无法识别等,这个要看编译器,不同C语言的编译器不一样。

    调用函数的方法

           库函数是系统声明和定义的,是现成的工具。自定义函数是程序员自己声明和定义的,是程序员补充的工具,不管是现成工具的还是补充的工具,都是工具,对使用者来说都一样,没有区别。

           在C语言中,函数的调用非常灵活,可以独占一行语句,也可以当成常量赋值给变量,也可以当成函数的参数。

           如果函数的返回值是void,表示该函数的的任务以完成某项功能为主,一般用单行书写,独占一条语句。

           如果函数的返回值不是void,如果单行书写,表示不关心它的返回值,也可以当成常量用于任何表达式中。

           例如:

           

    函数调用的过程

           当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行函数体的代码,当函数的返回语句被执行时,或到达函数的结束括号时,就把程序控制权交还给调用者程序。

           示例(book47.c)

           

           运行结果

           

     

    函数参数的传递

          关于函数的参数,在很多教程中有很多说法,如“形参”、“实参”、“值传递”、“地址传递”、“引用”等,这些说法把简单的概念复杂化了,大家不必理会。

          函数的参数可以理解为函数的局部变量,参数传递就是调用者程序把变量(或常量)的值复制一份给函数的参数,简单说来就是复制的过程。一旦完成数据的复制,调用者程序的变量和函数的参数就再也没有瓜葛了,所以,在函数调用的过程中,函数的参数的值发生改变并不会影响调用者程序的变量的值。

          我们在调用函数的时候,不关心函数参数的名称,函数参数的名称是函数自己的事情,只在函数内部使用,与调用者无关。

           示例(book48.c)

           

           运行结果

           

    const约束

           const 是 constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:

           const  int  a = 10;

           那么用 const 修饰后和未修饰前有什么区别呢?它们不都等于 10 吗?

           用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。

           在变量前加const约束,主要用于定义函数的参数,表示该参数在函数中是只读取,不允许改变,如果函数中试图改变它的值,编译的时候就会报错。

           例如:

           

           函数max在声明的时候,参数a和b都加了const约束,在函数中,a=10;和b=20;这两代码试图改变a和b的值。编译的时候如下:

     

           

          编译无法通过。

    应用经验

    1. 如果寻找函数

           在我的课程中,会介绍常用的库函数,但也有漏掉的。查资料是程序员的基本技能。

           例如要查找C语言复制字符串功能的函数,在百度上输入“C语言复制字符串”搜索就可以了,你想查什么就输入什么。

     

           

           然后,打开多几个网页看看,基本上就差不多了。

           注意一个问题,网上的内容太多太杂乱,重点关注百度百科的文章。

           1)测试函数的功能

           要使用函数,只需要关注它需要包含的头文件、函数名、返回值、参数的数据类型和参数的顺序,不必关心参数的名称。

           以strcpy函数为例,函数的声明如下。

           char *strcpy(char *dest, const char *src);

           函数名:strcpy

           返回值:返回dest,一般没用,不理它。

           第一个参数是目标字符串;第二个参数是源字符串,有const约束。

           写代码测试一下:

             char strname[50];

             strcpy(strname,"西施");

             printf("=%s=\n",strname);

           然后,看看输出的结果是不是“=西施=”,用=号夹住输出的内容是为了看清楚有没有其它的字符。

    版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

    来源:C语言技术网(www.freecplus.net

    作者:码农有道

    如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

    如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

    展开全文
  • c语言函数返回字符串

    千次阅读 2009-11-30 22:38:00
    C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为: 类型说明符 *函数名(形参表) { …… /*函数体*/ } 其中函数名之前加了“*”号表明这是...

    所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
    定义指针型函数的一般形式为:
        类型说明符 *函数名(形参表) 
        { 
            ……          /*函数体*/
        } 
    其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
    如:
        int *ap(int x,int y)
        {
          ......       /*函数体*/
    }
    表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
    【例】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
    main(){
      int i;
      char *day_name(int n);  
      printf("input Day No:/n");
      scanf("%d",&i);
      if(i<0) exit(1);
      printf("Day No:%2d-->%s/n",i,day_name(i));
    }
    char *day_name(int n){
      static char *name[]={ "Illegal day",
                            "Monday",
                            "Tuesday",
                            "Wednesday",
                            "Thursday",
                            "Friday",
                            "Saturday",
                            "Sunday"};
      return((n<1||n>7) ? name[0] : name[n]);
    }

    本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。
    应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int *p()是两个完全不同的量。
    int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
    int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
    对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。


    在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。
    【例】计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。
    struct stu
    {
        int num;
        char *name;
        char sex;
        float score;}boy[5]={
            {101,"Li ping",'M',45},
            {102,"Zhang ping",'M',62.5},
            {103,"He fang",'F',92.5},
            {104,"Cheng ling",'F',87},
            {105,"Wang ming",'M',58},
          };
    main()
    {
        struct stu *ps;
        void ave(struct stu *ps);
        ps=boy;
        ave(ps);
    }
    void ave(struct stu *ps)
    {
        int c=0,i;
        float ave,s=0;
        for(i=0;i<5;i++,ps++)
          {
            s+=ps->score;
            if(ps->score<60) c+=1;
          }
        printf("s=%f/n",s);
        ave=s/5;
        printf("average=%f/ncount=%d/n",ave,c);
    }

    本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。
    由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。

    展开全文
  • C语言 函数返回数组和指针区别

    千次阅读 2017-09-14 10:42:32
    ”存放在常量区,它在程序运行结束由操作系统回收,而指针p存放的是它的地址,在函数返回时候把它的地址返回给主函数,所以可以正确打印字符串。 函数str8(),在主函数未调用,因为调用程序会出现栈溢出,程序会停止...

    1.示例代码

    #include <stdio.h>
    
    char * str1()
    {
    	char A[] = "Hello!";
    	return A;
    }
    char * str2()
    {
    	char A[] = "Hello!";
    	char *p;
    	p = A;
    	return p;
    }
    char * str3()
    {	
    	char A[1024] = "Hello!";
    	return A;
    }
    char * str4()
    {
    	char A[1024] = "Hello!";
    	char *p;	
    	p = A;
    	return p;
    }
    char * str5()
    {
    	char A[1024] = "Hello!";
    	char *p;
    	A[1018] = 'h';
    	A[1019] = 'e';
    	A[1020] = 'l';
    	A[1021] = 'l';
    	A[1022] = 'o';
    	A[1023] = '\0';
    	p = A;
    	p += 1018;
    	return p;
    }
    char * str6()
    {
    	static char A[1024] = "Hello!";
    	char *p;
    	A[1018] = 'h';
    	A[1019] = 'e';
    	A[1020] = 'l';
    	A[1021] = 'l';
    	A[1022] = 'o';
    	A[1023] = '\0';
    	p = A;
    	p += 1018;
    	return p;
    }
    char * str7()
    {
    	char *p = "Hello!";
    	return p;
    }
    char * str8()
    {
    	char A[1024*1009] = "Hello!";
    	return A;
    }
    
    
    void main()
    {
    	printf("str1:%s\n", str1());
    	printf("str2:%s\n", str2());
    	printf("str3:%s\n", str3());
    	printf("str4:%s\n", str4());
    	printf("str5:%s\n", str5());
    	printf("str6:%s\n", str6());
    	printf("str7:%s\n", str7());
    	//printf("str8:%s\n", str8());
    }

    2.运行结果



    3.结果分析

    • 函数str1()和str2()返回乱码,这是因为函数运行时函数参数和函数里面的局部变量是存放在栈(stack)中,当函数结束返回时栈也被系统回收,所以返回的数组或者指针所指向的地址数据已经被覆盖,为乱码;
                注:更多了解程序在内存的位置参考:http://blog.csdn.net/hairetz/article/details/4141043#reply
    • 函数str3()和str4()为什么可以正常返回呢,组数在栈中的数据在函数返回时没有被操作系统回收吗?这个问题的答案留在下面回答。
    • 函数str5()中从数组的A[1018]元素到A[1023]元素分开赋值,然后指针P指到数组的A[1018]元素返回,打印结果乱码;
    • 函数str6()与str5()不同之处在于在声明数组A[]的时候加上static关键字,这表明数组中的数据不再存放在内存中的栈而是存放在静态变量区和全局变量放在一个区域,只有在程序运行结束后系统才会回收,所以可以正常返回;
    那么为啥函数str3()和str4()可以正常返回数组结果,str5()不可以呢,这是因为,他们三个函数中的数组都存放在内存中的栈中,只是因为数组设置的比较大为1024,当存放的是小数组“Hello!”时候可以返回是因为内存没有被完全覆盖,而在函数str5()中在数组的后面几个元素被覆盖了,所以输出乱码;这是偶然现象,如果在栈被回收后立马被完全利用,那么函数str3()和函数str4()返回的结果也会是乱码。
    • 为什么函数str7()可以正常返回字符串呢?这是因为声明的字符指针p存放在栈中,而“Hello!”存放在常量区,它在程序运行结束由操作系统回收,而指针p存放的是它的地址,在函数返回时候把它的地址返回给主函数,所以可以正确打印字符串。
    • 函数str8(),在主函数未调用,因为调用程序会出现栈溢出,程序会停止运行,可以看出这里的栈大小大约为1M Byte。

    4.如何修改

      那么如何修改成程序使得函数可以返回数组,这里有以下几种方法:
    1.   如上面程序str6()中把数组声明为static 存放在静态变量区,但是这样存在内存泄漏,也可以通过malloc(C语言)或者new(C++)将数组声明在堆(heap)中,
                然后在函数使用完后free()或者delete内存;不过有可能存在在函数外面忘记释放内存的情况;
             2.通过指向数组的指针或者结构实现,参考:http://blog.csdn.net/zouxinfox/article/details/2525206
             3.建议使用把数组作为函数的形参传递进去,在调用函数的主函数声明数组,在使用完后释放数组,参考:http://www.cnblogs.com/yangxi/archive/2011/09/18/2180759.html

    5. 思考

     在理解程序在内存中的存储情况,可以方便理解这个问题。
    展开全文
  • C语言 函数返回一位数组,二维数组

    万次阅读 多人点赞 2019-04-19 18:55:47
    万能的结构体:构造数组的结构体,将函数类型定义为此类型 但是考试的时候应该不太方便写结构体,写不下也会很麻烦,故介绍方法二 方法二: 指针传递: 1、返回一维数组 例子:将数组每一位加一: #include&...

    方法一:

    万能的结构体:构造数组的结构体,将函数类型定义为此类型

    但是考试的时候应该不太方便写结构体,写不下也会很麻烦,故介绍方法二

    方法二:

    指针传递:

    1、返回一维数组

    例子:将数组每一位加一:

    #include<stdio.h>
    #define N 10
    int main(){
        int *addOne(int a[]);
        int a[N]={1,2,3,4,5,6,7,8,9,10};
        int i;
        printf("\n调用函数之后:\n");
        int *b = addOne(a);
        for(i=0;i<N;i++)
            printf("%d\t",b[i]);
        
    }
    int *addOne(int a[]){
        int i;
        for(i=0;i<N;i++)//全部加一
            a[i] += 1;
        return a;
    }
    

    若在函数中新建一个指针作为返回,则需要为其申请空间

    注:int型占4个字节,char 1字节,double 8字节

    int *addOne(int a[]){
        int *b = (int *)malloc(N*sizeof(int));//定一个int型的指针b,并申请N*sizeof(int)个字节的存储空间,即N*4个字节
        int i;
        for(i=0;i<N;i++)//全部加一
            b[i] = a[i] + 1;
        return b;
    }

    2、返回二维数组

    #include<stdio.h>
    #define M 3
    #define N 2
    int main(){
        int **addOne(int a[M][N]);
        int a[M][N]={{1,1},{2,2},{3,3}};
        int i,j;
        printf("\n调用函数之后:\n");
        int **b = addOne((int **)a);
        for(i=0;i<M;i++)
            for(j=0;j<N;j++)
                printf("%d\t",*((int *)b+N*i+j));
        
    }
    int **addOne(int a[M][N]){
        int **b =(int **)malloc(M*sizeof(int *));//先申请M个指针型字节的空间
        for (int i=0;i<M;i++)
            b[i]=(int *)malloc(N*sizeof(int));//然后依次按一维申请
        int i,j;
        for(i=0;i<M;i++)
            for(j=0;j<N;j++)
                *((int *)b+N*i+j) = *((int *)a+N*i+j) + 1;//找地址,如同数据结构中矩阵找地址相同,首地址+(次数行数-1)*总列数+次数列数-1
                                                        //i,j都是从0开始,可以不用减1
        return b;
    }
    

     

     

     

     

    展开全文
  • C语言 函数

    千次阅读 2017-08-24 09:34:37
    结构化编程标准 1)程序控制流尽可能简单 2)应该自顶向下地设计程序结构 自顶向下设计(top-down design),也称逐步细化(stepwise refinement),把一个问题分解为几个小问题的组成. ...C语言函数语法 type function...
  • C语言函数调用及栈帧结构

    千次阅读 2016-11-17 19:10:11
     (4)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令。    注:函数栈帧的大小并不固定,一般与其对应函数的...
  • C语言函数深入理解

    千次阅读 2016-12-31 16:17:08
    C语言函数 张明阳 1.简述C语言函数的重要性 用C语言中的函数作为参照,有助于区分面向过程与面向对象两种重要的编程思想,C语言中的基本单位是函数,Java,C++,C#中的基本单位是类 2.简述为什么需要函数 1>避免了重复性...
  • 下午让同事写一个函数返回字符串形式的uuid给lua脚本,他的实现如下:static int new_uuid(lua_State* L){ char *uuidstr; uuid_t uuid; uint32_t status = 0; uuid_create(&uuid, &status); uuid_
  • c语言函数详解

    千次阅读 2017-03-12 09:54:02
    程序片段(01):函数.c+call.c+测试.cpp  内容概要:函数 ///函数.c #include #include //01.函数: // 1.函数的作用:重用代码,重用功能 // 表象:代码的封装,代码的重用 // 实质:功能的封装,功能的重用 int main01...
  • C语言函数调用栈(一)

    万次阅读 多人点赞 2018-07-19 22:16:25
    编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文)以备恢复以及存储本地局部变量。 不同处理器和编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一...
  • C语言函数为什么不能返回数组?在C语言程序开发中,我们不可以编写下面这样的代码:char f(void)[8] { char ret; // ...fill... return ret...
  • C语言函数调用及栈帧分析

    千次阅读 2015-11-16 10:00:54
    C语言函数调用及栈帧分析
  • c语言函数天天见

    千次阅读 2014-04-18 21:33:24
    总结在学习过程中遇到的c语言函数: 1、相关函数:fstat, lstat, chmod, chown, readlink, utime 头文件:#include #include 定义函数:int stat(const char * file_name, struct stat *buf); 函数说明:stat()用来...
  • C语言函数重入

    千次阅读 2018-08-02 11:25:50
    C语言函数重入 可重入函数:可以被中断的函数,即这个函数执行时,可以中断其执行,可以由一个或多个任务并发使用,而不比担心数据错误。 不可重入函数(不安全函数) 不能运行在多任务环境下,除非能保证互斥...
  • C语言system函数使用

    万次阅读 多人点赞 2019-11-08 19:09:18
    函数原型 包含在头文件 “stdlib.h” 中 int system(const char * command) 函数功能 执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名。另,在windows系统下参数字符串不区分...
  • C语言函数

    千次阅读 2008-02-29 13:17:00
    C语言函数库分类函数 目录函数 进程函数 诊断函数 接口子程序 输入输出str字符串操作函数 mem操作存贮数组 数学函数 时间日期函数 转换函数分类函数,所在函数库为ctype.h[top]int isalpha(int ch) 若ch是字母(A-Z,a-...
  • C语言 函数 循环

    千次阅读 2015-10-21 17:05:41
    1) 函数的参数,返回数值(示意图): main() { int a = 5,b=6,c; c = add(a,b); printf(“%d”,c); } 调用函数 a,b是实参 整个函数得到一个数值就是 Add函数返回数值。 int add ( int x, int y) ...
  • C语言函数的栈帧结构

    千次阅读 2018-05-10 12:55:17
    栈帧也就是函数的具体调用过程:函数的调用,参数的传递,函数执行完之后的返回等等! 我们先来一段简单的c语言代码:#include &lt;stdio.h&gt; #include &lt;windows.h&gt; int add(int A,int B)...
  • c语言函数调用过程-栈帧详解

    千次阅读 2018-03-10 16:47:41
    通过栈帧结构修改函数返回时的跳转地址 使非正常跳转的函数回来 手动调整main栈帧结构 测试环境,vs2017,win10 用一个测试代码来看 #include &lt;stdio.h&gt; int fun(int a, int b) { int...
  • c语言函数指针_指针函数_返回值是函数指针

    千次阅读 多人点赞 2019-03-06 17:38:43
    其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。...
  • c语言 函数之间 数据传递

    千次阅读 2019-10-30 16:29:10
    C语言函数的数据传递方式有三种:值传递;地址传递;全局变量传递。 在调用有参函数时,主调函数和被调用函数之间有数据传递关系。 首先认识两个概念: 1、形式参数(简称“形参”又叫“虚拟参数”):在定义函数...
  • 返回时,子函数返回,父函数返回。栈支持两种基本操作,push和pop。push将数据压入栈中,pop将栈中的数据弹出并存储到指定寄存器或者内存中。 (2)栈的生长方向是从高地址到低地址的,这是因为在下文讲的栈帧...
  • C语言fscanf函数读取结构化数据

    千次阅读 2017-03-22 11:21:03
    int fscanf (FILE *__restrict __stream, ...空格、tab、回车,读取成功返回所读的字段数,读取失败或读取结束返回EOF。fscanf()是按照__format的格式读取字段, 如下面代码例子,%s%d%s表示一次读入2个字段,读完第
  • C语言函数指针小结

    2009-05-10 12:44:00
    C语言函数指针小结1. 指针是C语言中一个重要的组成部分,使用指针编程有以下优点:(1)提高程序的编译效率和执行速度。(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。(3)可以...
  • c语言函数用指针传递参数问题

    千次阅读 2011-08-26 12:20:48
    c语言函数用指针传递参数问题 问题1:你是把变量传给了函数,还是把地址传给了函数? 例: #include #include #include void oxx(char* dest) { dest = (char*)malloc
  • c语言 函数声明定义总结

    千次阅读 2017-12-24 17:09:46
    函数的嵌套调用和链式访问 函数的声明与定义 static关键字总结 测试驱动开发TDD 函数的嵌套调用和链式访问 嵌套调用很好理解,就是在一个子程序里调用另一个子程序。 void print(char *a){ printf("%s",a...
  • C语言函数的出口——return 语句

    千次阅读 2010-06-11 00:12:00
    C语言函数的出口——return 语句
  • 若用函数调用的方式来实现交换,沿用上述思路初步实现如下: #include&lt;stdio.h&gt; void exchange(int,int); void exchange(int one,int another){ int t; t = one; one = another; anoth...
  • c语言函数调用中的栈帧变化

    千次阅读 2016-11-18 15:10:31
    我们写一个比较简单的c语言程序 `#include“ int fun(int x,int y) { int c = 0xcccccccc; printf(“hehe\n”); return c; } int main() { int a = 0xaaaaaaaa; int b = 0xbbbbbbbb; int c = fun

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 146,578
精华内容 58,631
关键字:

c语言函数返回结构

c语言 订阅