c语言函数的定义和声明 c语言函数的定义和声明区别

函数声明与函数定义的区别声明与定义的区别:
函数的声明与函数的定义形式上十分相似,但是二者有着本质上的不同 。声明是不开辟内存的,仅仅告诉编译器,要声明的部分存在,要预留一点空间 。定义则需要开辟内存 。
函数的定义
函数的定义是一个完整的函数单元,包含函数类型、函数名、形参及形参类型、函数体等 。在程序中,函数的定义只能有一次 。函数首部与花括号间不加分号 。
函数的声明
函数声明只是对编译系统的一个说明:函数声明是对定义的函数的返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型 。不包含函数体(或形参) , 调用几次该函数就应在各个主调函数中做相应声明 。函数声明是一个说明语句,必须以分号结束 。
拓展资料:
C语言编译系统是由上往下编译的.一般被调函数放在主调函数后面的话,前面就该有声明.不然C由上往下的编译系统将无法识别 。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次 。
函数声明由函数返回类型、函数名和形参列表组成 。形参列表必须包括形参类型,但是不必对形参命名 。这三个元素被称为函数原型,函数原型描述了函数的接口 。定义函数的程序员提供函数原型 , 使用函数的程序员就只需要对函数原型编辑即可 。
在C语言中,什么是声明、定义、初始化?有什么区别1.声明和定义是针对函数的概念:
包含函数实现的叫做函数的定义 , 一般位于.c文件中 , 如:
int func(int a){return a 1;}
不包含函数实现,只包含函数名的叫做函数的声明,一般位于.h文件中 。如:
int func(int a);
2.定义和初始化是针对变量的概念:
int a;就是变量的定义
a=0;就是变量的初始化
c语言函数声明假设主函数main() 。其他函数void fun(int a,int *b) 。
关于函数定义和声明:
在代码中fun函数 , 有完整函数体的代码就是函数定义部分 , 比如void fun(int a,int *b){ 。。。}; 。
如果没有具体实现的函数体代码(也就是大括号内容),那么就是函数声明 。比如void fun(int ,int *);
关于函数声明和调用:
如果fun函数定义在main代码上面 。比如:
void fun(int a,int *b){ 。。。};
int main(){
int a=0,int b=0;
......
fun(a,b);//这里fun定义代码在main上面,所以可以不需要声明 。反之需要先写声明语句
return 0;
}
关于函数局部变量及全局变量:
简单区分:
定义在函数之外的就是全局变量,这个变量所有函数都可以直接使用,并且共用同一个地址 。任意函数修改了变量值,其他函数调用也会变 。
定义在函数之内的就是局部变量,局部变量只属于该函数,其他函数即使定义了同样名字的变量,这两个变量也不同地址,互不相干 。
比如:
int a;//这就是全局变量,作用域下所有函数共用
int main()
{
int b;//这就是局部变量 , 只在本函数有效 , 如果想在调用fun函数时让fun也使用该变量 , 需要把这个变量的地址作为参数传递过去 。
printf("%d",b);
return 0;
}
注意:c语言中允许局部变量和全局变量同名 , 但是同名的局部变量会屏蔽全局变量,实际代码避免同名 。
关于函数传值和传址:
如函数void fun(int a,int *b){..........};这里形参a 和*b,分别表示一个值和一个地址
所以在调用该函数时,比如:
int main()
{
int c,d;
fun(c,d);//这里调用就对应上面形参类型,第一个参数传递了c的值(传值),第二个参数传递了d的地址(传址),这里c和d,叫做实参 。当fun函数运行时改变了a和b指向地址的值,对应main函数中c的值不变,d的值改变 。
return 0;
}
顺带一说:局部变量 , 在函数运行结束后会自动释放 , 所以想把局部变量地址作为返回值 , 需要用malloc函数申请 。(这里看不懂可以暂时忽视)
函数声明与函数定义分别在程序中的什么位置?为什么?函数c语言函数的定义和声明 , 是编程语言中可以独立运行的一个代码块 。
在C语言中c语言函数的定义和声明,程序从main()函数开始运行,其c语言函数的定义和声明他函数要被main函数调用才可以运行 。
在从shell解释器运行编译好的可执行程序时,main函数会被shell启动 , 开始运行 。
C语言的函数在使用时要经过3个步骤:声明、定义、调用 。
函数声明,就是给出函数的原型,让程序员知道怎么给函数传参数,怎么接收返回值,让编译器知道怎么进行代码的类型检查 。main函数的声明是这样的:
int main();
它的返回值是int类型,不需要传参数 。
printf()函数的声明是这样的:int printf(const char* fmt, ...);
它的返回值是int类型,第一个参数是格式字符串,之后可以跟可变参数 。
【c语言函数的定义和声明 c语言函数的定义和声明区别】函数声明的语法是:
返回值类型 函数名(形参类型0 形参变量0, 形参类型1 形参变量1);
如果有多个形参,就以逗号隔开 。每个形参都有类型和变量名 , 其中形参变量名在声明时可以省略 。最后以分号结尾,结束声明语句 。
如果不想让人看到函数的源码,就可以只提供一个声明和一个编译后的文件 , 这样别人就只能看汇编码了(笑) 。C语言的这个设计,对保护知识产权还是有利的 。
函数定义,就是在声明之后不跟分号,而是以大括号表示函数体,把函数的具体代码写在大括号内部 。
上图中的main()函数就是定义,printf()函数是声明 。
定义,实现的是函数的内容 。函数是不能多次定义的,否则编译器不知道采用哪个定义的代码 。
但函数可以多次声明,只要声明都是一样的,不互相矛盾 。
只要打了两个大括号{},就算定义了函数 。空实现也是实现,可以先占住这个位置 , 以后再填写具体的函数代码 。即,先给出整个程序的框架来,然后再填写细节 。
在实现了函数之后,必须去调用它,它才会运行 。
除了main函数是被shell启动的,其他函数都要直接或间接被main函数调用 。
某一个函数在运行时,实际是存在一条从main函数到它的调用链的 。
函数调用的语法是:
函数名(实参变量0, 实参变量1);
如果有多个实参,则以逗号隔开 。如果要接收函数调用的返回值,可以用一个变量去接收:
返回值变量 = 函数名(实参变量0, 实参变量1);
返回值变量的类型,要与函数的返回值类型一致,(返回值变量)在使用之前要先声明 。
对于有返回值的函数,也可以不接收它的返回值 。例如 , printf()虽然有个int类型的返回值 , 用于表示打印了多少个字符,但一般不接收它 。
所以C语言的入门代码都是printf("hello world\n");
而不是int ret = printf("hello world\n");
函数名,在C语言中属于标志符(identity) 。
标志符的命名规则是,以下划线或大小写字母开始 , 之后可以跟数字、字母、下划线,(但不能跟运算符或其他特殊符号) 。
它们在代码中用于表示变量名、结构体类型名、函数名,或者给goto使用的标号 。
基本类型的类型名,都被定义为了关键字,不能再用作标志符 。
struct S {
int a;
int b;
} s;
S是标志符,表示结构体类型S 。
a是标志符,表示结构体的成员变量a 。
s是标志符 , 表示变量s , 它的类型是结构体类型S 。
函数名 , 也属于标志符,所以函数名也要以下划线或大小写字母开始,不能是关键字、运算符、或其他特殊符号 。
0123 , 这不能做函数名,C语言的以0开始的数字是八进制数字 。
0x123,也不能做函数名,以0x开始的数字是16进制的数字 。
main,可以做函数名,这是主函数,在整个程序里只能有一个,不能作为普通函数的名字 。
__schedule,以下划线开始 , 可以做函数名 。
不过,以两个下划线开始的函数,大多是Linux系统或C库的函数 。普通函数最好别这么命名 。
char , 这不能做函数名,它是字符类型的关键字 。
,这也不能,它是表示加法的运算符 。
CreateWindowEx,这可以做函数名,一看就是典型的匈牙利风格,微软的代码(笑) 。这个函数是windows系统上创建窗口的API 。
匈牙利风格的代码,是从微软开始流行的一种风格 , 函数名以一个或多个英文单词命名,每个单词的首字母大写,其他字母小写 。
不过Linux的代码(包括第三方的软件),还是保持上古C代码的那种下划线风格 , 全部字母小写 , 单词之间以下划线分割,而且多使用缩写 。
有时候,缩写之后只剩下几个字母,就直接新组一个词当函数名了 。
例如 , Linux上启动新程序的函数execve(),就是个缩写的单词 。
执行的英文单词叫execute,windows上的可执行程序叫exe文件,就是这个词的前3个字母,Linux也选了这三个字母 。
cve这三个字母,来自完整的main函数的参数列表:
int main(int argc, char* argv[], char* envp);
main函数的完整声明是上面这个样子的 , int main()这个是简化版的 。
其中第一个参数argc,表示要传给main函数的参数个数 。通过命令行参数的形式传递 。arg是参数argument的缩写,c就是count,即参数个数 。
argv,是(传给main函数的)参数字符串的数组,v指的是vector 。
envp,是环境变量的路径,environment path 。
所以 , 启动main的系统调用就叫作execve()了,而不叫StartProgram() 。
虽然后者明显容易理解,但它字母多?。低车饔玫腁PI哪能让人一眼就看出来是启动进程的呢(汗) 。
回到开头,main()函数在Linux上就是被execve()这个API启动的,然后其他函数要被main函数直接或间接调用 。
不被main函数(直接或间接)调用的函数 , 并不会运行 。
上图的代码只会打印add,因为main只调用了add()函数,没有调用sub()函数 。
这段简单的代码,只有这三个函数 , sub()没有被调用 。
C语言函数定义和说明的格式你要的是何时说明吧
printf 格式说明符;
%c--字符
%d--十进制整数
%i--同%d
%e--以科学计数法表示浮点数(指数部分以e表示)
%E--以科学计数法表示浮点数(指数部分以E表示)
%f--浮点数
%g--在%e和%f表示中选取择短的一种
%G--在%E和%f表示中选取择短的一种
%o--无符号八进制整数
%s--字符串
\u--无符号整数
%x--无符号十六进制(小写x)整数
%X--无符号十六进制(大写X)整数
%p--输出指针内容
%n--显示至此printf已输入的字符数
%%--显示百分号
scanf格式说明符;
%c--读字符
%d--读整数
%i--同%d
%e--读浮点数
%f--读浮点数
%g--读浮点数
%o--读八进制数
%s--读字符串
%x--读十六进制整数
%p--读指针
%n--至此已读入的字符数
\u--读无符号整数
%[]--搜索字符集合
关于c语言函数的定义和声明和c语言函数的定义和声明区别的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读