c语言函数 订阅
C语言函数是一种函数,用来编译C语言,一般包括字符库函数,数学函数,目录函数,进程函数,诊断函数,操作函数等。 [1] 展开全文
C语言函数是一种函数,用来编译C语言,一般包括字符库函数,数学函数,目录函数,进程函数,诊断函数,操作函数等。 [1]
信息
性    质
函数
外文名
C language function
所在函数库
ctype.h
用    途
编译C语言
中文名
C语言函数
C语言函数字符库函数
所在函数库为【ctype.h】 [2]  int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')返回非0值,否则返回0int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)返回非0值,否则返回0int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'),走纸换行('\f'),垂直制表符('\v'),换行符('\n')返回非0值,否则返回0int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值,否则返回0int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')
收起全文
精华内容
下载资源
问答
  • C语言函数

    万次阅读 多人点赞 2019-08-03 19:54:19
    每个C程序都至少有一个函数,即主函数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语言函数返回值与参数传递

    千次阅读 2019-10-26 11:57:43
    C语言函数返回值与参数传递 一:参数传递 C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。 1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如: int test(int x,int y) { x=2*y; ...

    C语言函数返回值与参数传递

    一:参数传递

    C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。
    1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如:

    int test(int x,int y)
    {
        x=2*y;
        return x;
    }
    int main(void)
    { 
        int a=0,b=5;
        printf("%d,%d\n\r",test(a,b),a);
    	return 0;
    }
    

    运行结果为:
    10,0
    即传值方式只可以将实参传递给函数,不可以改变实参本身。

    2.传指针形式:直接传给函数的是变量的地址。
    如:

    int a(int b,int *c)
    {
        int i=0;
        for(i=0;i<4;i++)
            c[i]=b*i;
        return 0;
        
    }
    int main(void)
    { 
        int b=2,c[4],i;
        a(b,c);
        for(i=0;i<4;i++)
    	    printf("Data is -> %d\n\r",c[i]);
    	return 0;
    }
    

    运行结果为:
    Data is -> 0
    Data is -> 2
    Data is -> 4
    Data is -> 6

    由于被调函数在参数指针的作用域之内,此时可以直接改变变量的本体。

    二:返回值

    函数除了参数传递还有返回值,既可以返回变量值也可以返回地址。
    1.返回变量
    如:

    int a(int b)
    {
        int i=5;
        return 5*b;
    }
    int main(void)
    { 
        int b=2;
    	printf("Data is -> %d\n\r",a(b));
    	return 0;
    }
    

    运行结果

    Data is -> 10

    2.返回地址

    int *test(int b)
    {
        int i=0,buf[4];
        for(i=0;i<4;i++)
            buf[i]=b*i;
        return buf;
        
    }
    int main(void)
    { 
        int  b=2;
        int *p;
        int  i=0;
        p=test(b);
        for(i=0;i<4;i++)
        	printf("%d ,%d \n\r",p[i],test(b));
    	return 0;
    }
    

    运行结果
    0 ,1084896256
    2 ,1084896256
    4 ,1084896256
    6 ,1084896256

    另外不能返回局部变量地址。

    int *buf()
    {
    	 int dad;
    	 double buf[3][2];
    	 dad=sizeof(buf);
      	 return &dad;//error:由于dad是局部变量,函数结束后释放。
    }
    
    展开全文
  • 关于C语言函数练习题 让新手练习函数的使用
  • C语言函数的定义和声明

    万次阅读 多人点赞 2019-08-08 14:38:17
    本科学C语言的时候,就对函数的定义和声明的作用很迷糊,刚看到一篇博客,写得非常清楚,贴出来与各位共享! 一、函数的声明 1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用...

    本科学C语言的时候,就对函数的定义和声明的作用很迷糊,刚看到一篇博客,写得非常清楚,贴出来与各位共享!

    一、函数的声明

    1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数

    复制代码

    1 int sum(int a, int b) {
    2     return a + b;
    3 }
    4 
    5 int main()
    6 {
    7     int c = sum(1, 4);
    8     return 0;
    9 }

    复制代码

    第5行定义的main函数调用了第1行的sum函数,这是合法的。如果调换sum函数和main函数的顺序,在标准的C编译器环境下是不合法的(不过在GCC编译器环境下只是一个警告)

     

    2.如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数的前面进行函数的声明

    复制代码

     1 // 只是做个函数声明,并不用实现
     2 int sum(int a, int b);
     3 
     4 int main()
     5 {
     6     int c = sum(1, 4);
     7     return 0;
     8 }
     9 
    10 // 函数的定义(实现)
    11 int sum(int a, int b) {
    12     return a + b;
    13 }

    复制代码

    在第11行定义了sum函数,在第2行对sum函数进行了声明,然后在第6行(main函数中)就可以正常调用sum函数了。

     

    3.函数的声明格式

    1> 格式

    返回值类型  函数名 (参数1, 参数2, ...)

    只要你在main函数前面声明过一个函数,main函数就知道这个函数的存在,就可以调用这个函数。而且只要知道函数名、函数的返回值、函数接收多少个参数、每个参数是什么类型的,就能够调用这个函数了,因此,声明函数的时候可以省略参数名称。比如上面的sum函数声明可以写成这样:

    int sum(int, int);

    究竟这个函数是做什么用的,还要看函数的定义。

     

    2> 如果只有函数的声明,而没有函数的定义,那么程序将会在链接时出错

    下面的写法是错误的:

    复制代码

    1 int sum(int a, int b);
    2 
    3 int main()
    4 {
    5     
    6     sum(10, 11);
    7 
    8     return 0;
    9 }

    复制代码

    • 在第1行声明了一个sum函数,但是并没有对sum函数进行定义,接着在第6行调用sum函数
    • 这个程序是可以编译成功的,因为我们在main函数前面声明了sum函数(函数的声明和定义是两码事),这个函数声明可以理解为:在语法上,骗一下main函数,告诉它sum函数是存在的,所以从语法的角度上main函数是可以调用sum函数的。究竟这个sum函数存不存在呢,有没有被定义呢?编译器是不管的。在编译阶段,编译器并不检测函数有没有定义,只有在链接的时候才会检测这个函数存不存在,也就是检测函数有没有被定义。
    • 因此,这个程序会在链接的时候报错,错误信息如下:

    • 我这里的源文件是main.c文件,所以编译成功后生成一个main.o文件。链接的时候,链接器会检测main.o中的函数有没有被定义。
    • 上面的错误信息大致意思是:在main.o文件中找不到sum这个标识符。
    • 错误信息中的linker是链接器的意思,下次看到这个linker,说明是链接阶段出错了。链接出错了,就不能生成可执行文件,程序就不能运行。
    • 这个错误的解决方案就是加上sum函数的定义。

     

    二、多源文件开发

    1.为什么要有多个源文件

    1> 在编写第一个c语言程序的时候已经提到:我们编写的所有C语言代码都保存在拓展名为.c的源文件中,编写完毕后就进行编译、链接,最后运行程序。

    2> 在前面的学习过程中,由于代码比较少,因此所有的代码都保存在一个.c源文件中。但是,在实际开发过程中,项目做大了,源代码肯定非常多,很容易就上万行代码了,甚至上十万、百万都有可能。这个时候如果把所有的代码都写到一个.c源文件中,那么这个文件将会非常庞大,也非常恶心,你可以想象一下,一个文件有十几万行文字,不要说调试程序了,连阅读代码都非常困难。

    3> 而且,公司里面都是以团队开发为主,如果多个开发人员同时修改一个源文件,那就会带来很多麻烦的问题,比如张三修改的代码很有可能会抹掉李四之前添加的代码。

    4> 因此,为了模块化开发,一般会将不同的功能写到不同的.c源文件中,这样的话,每个开发人员都负责修改不同的源文件,达到分工合作的目的,能够大大提高开发效率。也就是说,一个正常的C语言项目是由多个.c源文件构成。

     

    2.将sum函数写到其他源文件中

    接下来就演示一下多个源文件的开发,我将前面定义的sum函数写在另一个源文件(命名为sum.c)中。这时候就有两个源文件:

    1> main.c文件

    1 int main()
    2 {
    3 
    4     return 0;
    5 }

    2> sum.c文件

    1 int sum(int a, int b)
    2 {
    3     return a + b;
    4 }

     

    3.在main函数中调用sum函数

    1> 现在想在main函数中调用sum函数,那么你可能会直接这样写:

    复制代码

    1 int main()
    2 {
    3     int c = sum(10, 11);
    4 
    5     return 0;
    6 }

    复制代码

    这种写法在标准C语言编译器中是直接报错的,因为main函数都不知道sum函数的存在,怎么可以调用它呢!!!

    2> 我们应该骗一下main函数,sum函数是存在的,告诉它sum函数的返回值和参数类型即可。也就是说,应该在main函数前面,对sum函数进行声明。

    main.c文件应该写成下面这样

    复制代码

     1 #include <stdio.h>
     2 
     3 int sum(int, int);
     4 
     5 int main()
     6 {
     7     int c = sum(10, 11);
     8     
     9     printf("c is %d\n", c);
    10     
    11     return 0;
    12 }

    复制代码

    注意第3行,加了一个sum函数的声明。为了检验sum函数的调用结果,在第9行用prinf函数将结果输出。

     

    4.编译所有的源文件

    sum.c和main.c都编写完毕后,就可以使用gcc指令进行编译了。同时编译两个文件的指令是:cc -c main.c sum.c

    编译成功后,生成了2个.o目标文件

    也可以单独编译:

    cc -c main.c

    cc -c sum.c

     

    5.链接所有的目标文件

    前面已经编译成功,生成了main.o和sum.o文件。现在应该把这2个.o文件进行链接,生成可执行文件。

    1> 注意,一定要同时链接两个文件。如果你只是单独链接main.o或者sum.o都是不可能链接成功的。原因如下:

    • 如果只是链接main.o文件:cc main.o,错误信息是:在main.o中找到不到sum这个标识符,其实就是找不到sum函数的定义。因为sum函数的定义在sum.o文件中,main.o中只有sum函数的声明

    • 如果只是链接sum.o文件:cc sum.o,错误信息是:找不到main函数。一个C程序的入口点就是main函数,main函数定义在main.o中,sum.o中并没有定义main函数,连入口都没有,怎么能链接成功、生成可执行文件呢?

    可以看出,main.o和sum.o有密不可分的关系,其实链接的目的就是将所有相关联的目标文件和C语言函数库组合在一起,生成可执行文件。

    2> 链接main.o和sum.o文件:cc main.o sum.o,生成了可执行文件a.out

    3> 运行a.out文件:./a.out,运行结果是在屏幕上输出了:

    c is 21

    说明函数调用成功,我们已经成功在main.c文件的main函数中调用了sum.c文件中的sum函数

    4> 从中也可以得出一个结论:只要知道某个函数的声明,就可以调用这个函数,编译就能成功。不过想要这个程序能够运行成功,必须保证在链接的时候能找到函数的定义。

    三、#include

    理解完前面的知识后,接下来就可以搞懂一个很久以前的问题:每次写在最前面的#include是干啥用的?

    1.#include的作用

    先来看一个最简单的C程序:

    复制代码

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     printf("Hello, World!\n");
    6     return 0;
    7 }

    复制代码

    这个程序的作用是在屏幕上输出Hello,World!这一串内容,我们主要关注第一行代码。

    • #include 是C语言的预处理指令之一,所谓预处理,就是在编译之前做的处理,预处理指令一般以 # 开头
    • #include 指令后面会跟着一个文件名,预处理器发现 #include 指令后,就会根据文件名去查找文件,并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源文件中的 #include 指令,就像你把被包含文件中的全部内容拷贝到这个 #include 指令所在的位置一样。所以第一行指令的作用是将stdio.h文件里面的所有内容拷贝到第一行中。
    • 如果被包含的文件拓展名为.h,我们称之为"头文件"(Header File),头文件可以用来声明函数,要想使用这些函数,就必须先用 #include 指令包含函数所在的头文件
    • #include 指令不仅仅限于.h头文件,可以包含任何编译器能识别的C/C++代码文件,包括.c、.hpp、.cpp等,甚至.txt、.abc等等都可以

    也就是说你完全可以将第3行~第7行的代码放到其他文件中,然后用 #include 指令包含进来,比如:

    1> 将第3行~第7行的代码放到my.txt中

    2> 在main.c源文件中包含my.txt文件

    • 编译链接后,程序还是可以照常运行的,因为 #include 的功能就是将文件内容完全拷贝到 #include 指令所在的位置
    • 说明:这里用txt文件纯属演示,平时做项目不会这样做,除非吃饱了撑着,才会把代码都写到txt中去

     

    2.#include可以使用绝对路径

    上面的#include "my.txt"使用的是相对路径,其实也可以使用绝对路径。比如#include "/Users/apple/Desktop/my.txt"

     

    3.#include <>和#include ""的区别

    二者的区别在于:当被include的文件路径不是绝对路径的时候,有不同的搜索顺序。

    1> 对于使用双引号""来include文件,搜索的时候按以下顺序:

    • 先在这条include指令的父文件所在文件夹内搜索,所谓的父文件,就是这条include指令所在的文件
    • 如果上一步找不到,则在父文件的父文件所在文件夹内搜索;
    • 如果上一步找不到,则在编译器设置的include路径内搜索;
    • 如果上一步找不到,则在系统的INCLUDE环境变量内搜索

    2> 对于使用尖括号<>来include文件,搜索的时候按以下顺序:

    • 在编译器设置的include路径内搜索;
    • 如果上一步找不到,则在系统的INCLUDE环境变量内搜索

    我这里使用的是clang编译器,clang设置include路径是(4.2是编译器版本):/usr/lib/clang/4.2/include

    Mac系统的include路径有:

    • /usr/include
    • /usr/local/include

     

    4.stdio.h

    我们已经知道#include指令的作用了,可是为什么要在第一行代码包含stdio.h呢?

    • stdio.h 是C语言函数库中的一个头文件,里面声明了一些常用的输入输出函数,比如往屏幕上输出内容的printf函数
    • 这里之所以包含 stdio.h 文件,是因为在第5行中用到了在 stdio.h 内部声明的printf函数,这个函数可以向屏幕输出数据,第7行代码输出的内容是:Hello, World!
    • 注意:stdio.h里面只有printf函数的声明。前面已经提到:只要知道函数的声明,就可以调用这个函数,就能编译成功。不过想要这个程序能够运行成功,必须保证在链接的时候能找到函数的定义。其实链接除了会将所有的目标文件组合在一起,还会关联C语言的函数库,函数库中就有printf函数的定义。因此前面的程序是可以链接成功的。

     

    5.头文件.h和源文件.c的分工

    跟printf函数一样,我们在开发中会经常将函数的声明和定义写在不同的文件中,函数声明放在.h头文件中,函数定义放在.c源文件中。

    下面我们将sum函数的声明和定义分别放在sum.h和sum.c中

    这是sum.h文件

    这是sum.c文件

    然后在main.c中包含sum.h即可使用sum函数

    其实sum.h和sum.c的文件名不一样要相同,可以随便写,只要文件名是合法的。但还是建议写成一样,因为一看文件名就知道sum.h和sum.c是有联系的。

    运行步骤分析:

    1> 在编译之前,预编译器会将sum.h文件中的内容拷贝到main.c中

    2> 接着编译main.c和sum.c两个源文件,生成目标文件main.o和sum.o,这2个文件是不能被单独执行的,原因很简单:

    * sum.o中不存在main函数,肯定不可以被执行

    * main.o中虽然有main函数,但是它在main函数中调用了一个sum函数,而sum函数的定义却存在于sum.o中,因此main.o依赖于sum.o

    3> 把main.o、sum.o链接在一起,生成可执行文件

    4> 运行程序

     

    说到这里,有人可能有疑惑:可不可以在main.c中包含sum.c文件,不要sum.h文件了?

    大家都知道#include的功能是拷贝内容,因此上面的代码等效于:

    这么一看,语法上是绝对没有问题的,main.c、sum.c都能编译成功,分别生成sum.o、main.o文件。但是当我们同时链接main.o和sum.o时会出错。原因:当链接这两个文件时链接器会发现sum.o和main.o里面都有sum函数的定义,于是报"标识符重复"的错误,也就是说sum函数被重复定义了。默认情况下,C语言不允许两个函数的名字相同。因此,不要尝试去#include那些.c源文件。

     

    有人可能觉得分出sum.h和sum.c文件的这种做法好傻B,好端端多出2个文件,你把所有的东西都写到main.c不就可以了么?

    • 没错,整个C程序的代码是可以都写在main.c中。但是,如果项目做得很大,你可以想象得到,main.c这个文件会有多么庞大,会严重降低开发和调试效率。
    • 要想出色地完成一个大项目,需要一个团队的合作,不是一个人就可以搞的定的。如果把所有的代码都写在main.c中,那就导致代码冲突,因为整个团队的开发人员都在修改main.c文件,张三修改的代码很有可能会抹掉李四之前添加的代码。
    • 正常的模式应该是这样:假设张三负责编写 main函数,李四负责编写其他自定义函数,张三需要用到李四编写的某个函数,怎么办呢?李四可以将所有自定义函数的声明写在一个.h文件中,比如 lisi.h,然后张三在他自己的代码中用#include包含lisi.h文件,接着就可以调用lisi.h中声明的函数了,而李四呢,可以独立地在另外一个文件中(比如lisi.c)编写函数的定义,实现那些在lisi.h中声明的函数。这样子,张三和李四就可以相互协作、不会冲突。
    展开全文
  • C语言函数作为函数参数

    万次阅读 多人点赞 2019-09-13 11:35:15
    c,c++中是可以向Python那样将函数作为函数参数的,具体实现方法如下

    C语言函数作为参数

    为了满足DRY思想,减少代码的重复性,考虑将函数作为参数传入另一函数中。C语言是可以将函数作为函数参数的。
    用到的方法是函数指针。
    首先需要明确的是, 在C语言中,函数名就是函数的首地址,所以将函数作为函数参数的思路是将函数地址传入,形参是一个指针类型的变量,形参的基类型为函数原型。
    参数原型为:
    ElemType(*FunctionName)(ElemType, ElemType, ......)
    其中:ElemType为声明(如int, float, double,struct等)
    以冒泡排序为例借助判断大小函数进行数组排序的具体实现方法如下:

    #include <stdio.h>
    
    #define YES 1
    #define NO 0
    
    ///*判断函数,进行元素大小判断,increase判断大小比较*/
    int compare(int a, int b, int increase)
    {
    	if (increase > 0) {
    		if (a > b) return YES;
    		else return NO;
    	}
    	else
    	{
    		if (a < b)  return YES;
    		else return NO;
    	}
    }
    /*冒泡排序进行数组排序*/
    void OrderArr(int arry[], int(*compare)(int, int, int), int length, int increase = 1)
    {
    	for (int i = 0; i < length - 1; i++)
    	{
    		for (int j = 0; j < length - i - 1; j++)
    		{
    			if (compare(*(arry + j), *(arry + j + 1), increase))
    			{
    				int temp = *(arry + j + 1);
    				*(arry + j + 1) = *(arry + j);
    				*(arry + j) = temp;
    			}
    		}
    	}
    }
    
    /*输出函数*/
    void Print(int a[], int length)
    {
    	for (int i = 0; i < length; i++)
    	{
    		printf("%d ", *(a + i));
    	}
    	printf("\n");
    }
    
    int main()
    {
    	int a[5] = { 1, 4, 2, 6, 3 };
    	//增序排列数组
    	OrderArr(a, compare, 5);
    	Print(a, 5);
    	//降序排列数组
    	OrderArr(a, compare, 5, -1);
    	Print(a, 5);
    }
    
    展开全文
  • C语言函数大全_MSDN

    热门讨论 2011-08-20 08:23:28
    C语言函数大全_MSDN 可以快捷方便的查询C语言函数如何使用。
  • C语言函数返回值详解

    万次阅读 多人点赞 2020-02-24 11:32:28
    函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句的一般形式为: return 表达式;...C语言返回值 1 . 没有返回值的函数为空类型,用...
  • C语言函数名、&函数名、*函数名

    千次阅读 2020-08-25 16:14:18
    C语言函数名、取地址函数名、解引用函数名关系
  • C语言函数定义和函数调用

    千次阅读 2020-04-01 19:05:47
    1、函数的定义 C源程序是由函数组成的。最简单的程序有一个主函数 main(),但实用程序往往由多个函数组成,由 主函数调用其他函数,其他函数也可以互相调用。函数是C源程序的基本模块,程序的许多功能是通过对 函数模块...
  • C语言函数 思维导图

    千次阅读 2020-05-14 23:05:34
    离 复试还有两天哦,一天天逼近了,此刻有点激动、有点紧张、有点兴奋,哈哈哈,加油!! 将C语言函数做了一个完整的思维导图,非常有助于学习!
  • C语言函数及其调用

    万次阅读 多人点赞 2019-04-19 00:08:23
    一、C语言函数 1.概念:函数是一组一起执行一个任务的语句,每个c程序都必须有一个main函数,程序员可以把代码划分到不同的函数当中去,在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。c标准库提供...
  • C语言函数的参数

    千次阅读 2019-03-21 23:07:27
    一、函数的参数可以是变量、变量指针和变量引用: void funcA(int8_t x) { x=x+1; } 代码说明:该函数的参数属于值传递,在调用该函数时,仅仅只是把实参的值拷贝了一份赋值给了形参x,之后的任何操作都不会影响到...
  • C语言 函数类型

    万次阅读 2019-06-04 17:47:44
    1. 在 [不完全类型] 一文中,描述了C中的3大数据类型,即: 函数类型、对象类型和不完全类型, 这里再次引用这张图来进行“函数类型”的讲解。 可以看到,函数类型是对立于其他的类型的,它不像“对象类型和不...
  • C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言函数库大全C语言...
  • c语言函数重名问题

    千次阅读 2019-06-13 11:05:40
    提问:c语言 可以函数重载吗? answer:可以实现。我参考了几种说法。 1,c语言不支持函数重载。同一作用区域不可以有函数重名,但不同作用区域中允许函数重名。不同作用区域可以通过在不同文件中使用static实现...
  • C语言函数-形参和实参

    千次阅读 多人点赞 2019-04-29 09:34:34
    在定义函数名和函数体的时候使用的参数,他没有数据,可以看做一个占位符,只能等到函数被调用时接收传递进来的数据,所以称为形式参数; 实参(也叫实际参数) 在调用时传递给函数的参数,即传递给被调用函数的值,会...
  • C语言 函数声明

    千次阅读 多人点赞 2019-03-27 22:00:51
    函数与调用它的函数(即主调函数)不在同一文件中,或者函数定义的位置在主调函数之后,则必须在调用此函数之前对被调用的函数作声明。 所谓函数声明,就是在函数尚在未定义的情况下,事先将该函数的有关信息通知...
  • 关于C语言函数的默认返回值

    千次阅读 2019-09-05 21:37:38
    C语言函数默认返回值 int型函数运行无误默认返回值为1,而float默认返回值为函数中最后一个操作过的float变量的值. #include <stdio.h> int foo1() { int i, j, k; i = 3; j = 2; k = 5; } float foo2() ...
  • c语言函数调用及应用举例

    万次阅读 多人点赞 2019-04-20 16:27:29
    分为:I/O函数,字符串,字符处理函数,数学函数,接口函数,时间转换和操作函数,动态地址分配函数,目录函数,过程控制函数,字符屏幕和图形功能函数。 这些库函数在不同的头文件中声明。比如: math.h头文件中...
  • C语言函数的定义和调用

    千次阅读 2020-03-30 19:22:56
    一、定义函数 定义一个函数我们需要确定三部分内容: 1.函数的返回值类型 2.函数的名称 3.函数的参数 确定了以上内容后就可以定义一个特有功能的函数了: int wrongplus(int a, int b) { a = a + 1; b = b + 1; ...
  • C语言 函数参数和调用函数

    千次阅读 多人点赞 2019-04-14 08:39:07
    如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。 形式参数在进入函数时被创建,退出函数时被销毁。 当调用函数时,有两种向函数传递参数的方式: 传值调用 默认情况下,C 语言使用...
  • C语言函数无返回值 参数

    千次阅读 2021-03-24 10:29:54
    函数被调用时,才申请了该内存空间,才有了这个变量,同时这个空间内的数据被赋值成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数。 何时释放了该空间: 函数执行结束后,该空间由内存管理单元自动回收...
  • @C语言return的用法详解,C语言函数返回值详解 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的...
  • C语言函数的嵌套调用

    千次阅读 2019-05-18 21:23:07
    例子:通过比较找出输入的4个数中最大的数 #include <stdio.h> int main () { int max_4 (int a, int b,int c, int d); int a,b,c,d,max; printf("please enter 4 interger numbers:");...
  • C语言函数声明、定义、调用

    千次阅读 多人点赞 2019-03-15 13:41:07
    //函数声明 //函数定义开始 void print_C() { printf(&amp;quot; ###### \n&amp;quot;); printf(&amp;quot;## ##\n&amp;quot;); printf(&amp;quot;## \n&amp;quot
  • C语言函数传递方式-值传递和地址传递

    千次阅读 多人点赞 2020-03-02 12:10:20
    C语言函数传递方式 值传递 定义 所谓的值传递,顾名思义就是使用变量、常量、数组等作为函数的参数。 地址传递
  • C语言函数的格式

    千次阅读 2019-04-29 07:45:00
    #include <stdio.h>#include <stdlib.h>...//函数能多次声明//int addf(int a,int b);//声明可以省略“extern”//int addf(int,int);//声明也可以省略变量命"a","b"int main(){ int a,b,c; ...
  • c语言函数返回值问题

    千次阅读 2017-04-23 22:00:06
    C语言中,调用函数结束时,如果有返回值,会涉及到函数返回值传递问题,根据返回值的大小,会有不同的处理方式。 一、返回值小于等于4个字节 函数执行完毕后,如果返回值小于等于4字节,则会将值保存在寄存器eax中...
  • C语言函数指针和函数的首地址

    千次阅读 2019-06-05 11:38:56
    一个函数在编译之后,会占据一部分内存,而它的函数名,就是这段函数的首地址。看如下代码 // // Created by lwl on 2019/6/2. // #include <string.h> #include <stdlib.h> #include <stdio.h> ...
  • C语言函数中的数组传递

    千次阅读 2019-07-02 17:17:14
    #include <stdio.h> typedef unsigned char uchar; //---------------------------------------------------全局...//---------------------------------------------------子函数声明 void func3(void)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 699,777
精华内容 279,910
关键字:

c语言函数

c语言 订阅