你可以写程序测试一下.
int * scanffile(FILE *fp,int n){
int i;
static int array[10]; //因为array是局部变量,随scanffile()函数的结束,该内存被释放,所以呢,你在之后得不到相应的数据了. 改成static静态变量就可以了!
for(i=0;in;i++){
fscanf(fp,"%d\t",array[i]);
}
printf("%d\t",array[i]);
return array;
#include stdio.h
void f()
{
void main()
printf("%u\n", f);
printf("%p\n", f);
主函数中前两行%u表示输出无符号的十进制,而第三行%p表示输出地址,其结果是一个十六进制的数,你将其转换成十进制,你会发现与前两行结果一样.
在一个函数定义中,函数体之前的所有部分称为函数头,它给出了该函数的返回类型、每个参数的次序和类型等函数原型信息,所以当没有专门给出函数原型说明语句时,系统就从函数头中获取函数原型信息.
一个函数的原型语句就是其函数头的一个拷贝,当然要在最后加上语句接上结束符分号.函数原型语句与函数头也有细微的差别,在函数原型语句中,其参数表中的每个参数允许只保留参数类型,而省略参数名,并且若使用参数名也允许与函数头中对应的参数名不同.
全文如下:
一)、定义格式
类型名 函数名 ([参数表]) 函数体
类型名为系统或用户已定义的一种数据类型,它是函数执行过程中通过return语句要求返回的值的类型,又称为该函数的类型.当一个函数不需要通过return语句返回一个值时,称为无返回值函数或无类型函数,此时需要使用保留字void作为类型名.当类型名为int时,可以省略不写,但为了清楚起见,还是写明为好.
函数名是用户为函数所起的名字,它是一个标识符,应符合C++标识符的一般命名规则,用户通过使用这个函数名和实参表可以调用该函数.
参数表又称形式参数表,它包含有任意多个(含0个,即没有)参数说明项,当多于一个时其前后两个参数说明项之间必须用逗号分开.每个参数说明项由一种已定义的数据类型和一个变量标识符组成,该变量标识符成为该函数的形式参数,简称形参,形参前面给出的数据类型称为该形参的类型.一个函数定义中的参数表可以被省略,表明该函数为无参函数,若参数表用void取代,则也表明是无参函数,若参数表不为空,同时又不是保留字void,则称为带参函数.
函数体是一条复合语句,它以左花括号开始,到右花括号结束,中间为一条或若干条C++语句.
在一个函数的参数表中,每个参数可以为任一种数据类型,包括普通类型、指针类型、数组类型、引用类型等,一个函数的返回值可以是除数组类型之外的任何类型,包括普通类型、指针类型和引用类型等.另外,当不需要返回值时,应把函数定义为void类型.
二)、定义格式举例
(1) void f1() {...}
在第一条函数定义中,函数名为f1,函数类型为void,参数表为空,此函数是一个无参无类型函数.若在f1后面的圆括号内写入保留字void,也表示为无参函数.
在第二条函数定义中,仅带有一个类型为int的形参变量x,该函数没有返回值.
三)、有关函数定义的几点说明
① 函数原型语句
一个函数必须先定义或声明而后才能被调用,否则编译程序无法判断该调用的正确性.一个函数的声明是通过使用一条函数原型语句实现的,当然使用多条相同的原型语句声明同一个函数虽然多余但也是允许的,编译时不会出现错误.
在一个完整的程序中,函数的定义和函数的调用可以在同一个程序文件中,也可以处在不同的程序文件中,但必须确保函数原型语句与函数调用表达式出现在同一个文件中,并且函数原型语句出现在前,函数的调用出现在后.
通常把一个程序中用户定义的所有函数的原型语句组织在一起,构成一个头文件,让该程序中所含的每个程序文件的开始(即所有函数定义之前)包含这个头文件(通过#include命令实现),这样不管每个函数的定义在哪里出现,都能够确保函数先声明后使用(即调用)这一原则的实现.
在定义一个函数时,若只允许函数体访问一个形参的值,不允许修改它的值,则应把该形参说明为常量,这只要在形参说明的前面加上const保留字进行修饰即可.如:
void f10(const char* p, char key);
在一个函数定义中,可根据需要对参数表末尾的一个或连续若干个参数给出缺省值,当调用这个函数时,若实参表中没有给出对应的实参,则形参将采用这个缺省值.如:
void f11(int x, int y=0) {...}
函数f11的定义带有两个参数,分别为整型变量x和y,并且y带有缺省值0,若调用该函数的表达式为f11(a,b),将把a的值赋给x,把b的值赋给y,接着执行函数体;若调用该函数的表达式为f11(a+b),则也是正确的调用格式,它将把a+b的值赋给x,因y没有对应的实参,将采用缺省值0,参数传送后接着执行函数体.
void f11(int x, int y=0);
函数定义应分别改写为:
void f11(int x, int y) {...}
在函数定义中的每个数组参数实际上是指向元素类型的指针参数.对于一维数组参数说明:
数据类型 数组名[]
它与下面的指针参数说明完全等价:
数据类型 *指针变量名
对于二维数组参数说明:
数据类型 参数名[][第二维尺寸]
数据类型 (*参数名)[第二维尺寸]
当调用一个函数时就执行一遍循环体,对于类型为非void的函数,函数体中至少必须带有一条return语句,并且每条return语句必须带有一个表达式,当执行到任一条return语句时,将计算出它的表达式的值,结束整个函数的调用过程,把这个值作为所求的函数值带回到调用位置,参与相应的运算;对于类型为void的函数,它不需要返回任何函数值,所以在函数体中既可以使用return语句,也可以不使用,对于使用的每条return语句不允许也不需要带有表达式,当执行到任一条return语句时,或执行到函数体最后结束位置时,将结束函数的调用过程,返回到调用位置向下继续执行.
当在一个函数的定义或声明前加上关键字inline则就把该函数声明为内联函数.计算机在执行一般函数的调用时,无论该函数多么简单或复杂,都要经过参数传递、执行函数体和返回等操作.若把一个函数声明为内联函数后,在程序编译阶段系统就有可能把所有调用该函数的地方都直接替换为该函数的执行代码,由此省去函数调用时的参数传递和返回操作,从而加快整个程序的执行速度.通常可把一些相对简单的函数声明为内联函数,对于较复杂的函数则不应声明为内联函数.从用户的角度看,调用内联函数和一般函数没有任何区别.下面就是一个内联函数定义的例子,它返回形参值的立方.
inline int cube(int n)
return n*n*n;
#include"stdio.h"
int a,b;
printf("a=%d\nb=%d\n",a,b); //输出两行,a=XXXXX b=XXX
fseek(fp,0,SEEK_SET);//这个函数就是把文件描述符跳转到文件的开头位置
以上就是土嘎嘎小编为大家整理的c语言取函数地址头部相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!