首页 > 手机 > 配件 > 如何定义函数指针,c语言定义函数

如何定义函数指针,c语言定义函数

来源:整理 时间:2022-04-04 04:36:40 编辑:华为40 手机版

C语言函数的结构是固定的在我之前的文章里介绍过,C语言作为编程语言,是一种形式语言,具有固定的格式结构和符号:返回值类型函数名(参数列表){语句列表}注意函数名在相应可见域内要保持唯一性,例如,在main函数所在文件里定义的函数名不能也为main。

C语言,自定义函数要注意些什么

C语言中自定义函数一个最常见的注意点就是区分“值传递”和“址传递”了。“值传递”和“址传递”就一个字不一样,而且发音还非常的接近,但就是天壤之别。许多初学C语言的小伙伴经常搞不清通过函数传递一个数据值和传递一个地址,以至于C程序的运行结果大相径庭。本回答就来详细讲解下C语言中“址传递”和“值传递”的区别。

一、值传递和址传递的C程序代码为了说清“值传递”和“址传递”之间的区别,我们先看一段C程序代码,如下:上述C程序代码非常简单:在C程序的main函数中定义了两个整型变量para1与para2,初始值分别是1和2;还有一个指针变量pInt,初始值是变量para2的地址。在C程序的main函数中,先调用了自定义函数ValueTrans,并且把变量para1作为参数。

在自定义函数ValueTrans中,将变量para1重新赋值为11。在调用完函数ValueTrans后输出变量para1的值,看看是多少;在C程序的main函数中,再次调用了自定义函数AddrTrans,并且把指针pInt作为参数。在自定义函数AddrTrans中,将指针pInt指向的值重新赋值为22。

在调用完函数AddrTrans后输出变量para2的值,看看是多少;现在我们看看这段C程序的运行结果:惊不惊喜?意不意外?二、值传递和址传递的解释现在我们来解释下上述C程序代码为何是这么个运行结果。1、值传递上述C程序代码调用函数ValueTrans,把变量para1作为参数,注意就是把变量para1的值1作为参数。

在具体执行函数ValueTrans时,系统自己默默地、悄悄地在某一个地方新建了一个也叫作para1的整型变量。这个整型变量para1可不是C程序代码main函数中的那个para1.我们可以把main函数中的para1变量看做是main_para1,把函数ValueTrans中的para1看做是ValueTrans_para1.那么在函数ValueTrans中其实是把11赋值给了变量ValueTrans_para1,至于变量main_para1嘛,纹丝不动!所以在C程序main函数中,最后变量para1的值还是1.2、址传递上述C程序代码调用函数AddrTrans,把指针pInt作为参数,注意此时就是把变量para2的地址作为参数,这就有意思啦!在具体执行函数AddrTrans时,系统自己同样地、悄悄地在某一个地方新建了一个也叫作pInt的指针变量。

但是这个指针变量pInt的值就是main函数中的那个pInt的值.换句话说,两个指针变量pInt同时指向了C程序中main函数的变量para2。那么在函数AddrTrans中把22赋值给了指针pInt指向的值,其实也就改变了main函数中的变量para2的值,太神奇了!这就是C语言指针的魅力所在!所以在C程序main函数中,最后变量para2的值就变成了22.上述是C语言编程中自定义函数时要注意的一个地方。

编写C语言程序经常要用很多函数,怎样定义自己的函数?为什么要定义函数,不麻烦吗?

在C语言程序开发中,我们常常使用一些库函数(例如 printf,sin 等函数)。事实上,实际需求通常是非常复杂的,只依靠现有的函数很难完成。这就需要自己定义 C语言函数。可以把一个函数看作是一块积木,各种各样的积木才能堆积成复杂的建筑。只有几种积木,能完成的建筑太有限了,如果能够自己造各种各样的积木,再复杂的建筑也能完成。

C语言函数的结构是固定的在我之前的文章里介绍过,C语言作为编程语言,是一种形式语言,具有固定的格式结构和符号:返回值类型 函数名(参数列表) { 语句列表}注意函数名在相应可见域内要保持唯一性,例如,在 main 函数所在文件里定义的函数名不能也为 main。再啰嗦一下 main 函数,主要是因为它是默认的入口函数,比较特殊。

Old Style C的风格的 main 函数定义写成 main(){…} 形式,不写返回值类型也不写参数列表。Old Style C规定不写返回值类型就表示返回int型,不写参数列表就表示参数类型和个数没有明确指出。这种宽松的规定会导致很多复杂的Bug产生,现在的 C 也保持了这种写法的兼容,但是鉴于它可能会产生 bug,还是不要这样写。

其实系统在调用 main 函数时是传参数的,所以 main 函数最标准的形式应该是 int main(int argc, char * argv[]),这种参数传递在 linux 下使用起来非常方便,以后用到了再详细解释。C标准也规定了 int main(void) 这种形式,如果不使用系统传进来的两个参数也可以写成这种形式。

但除了这两种形式之外,以其它形式定义main函数都是错误的或不可移植的。自定义函数在了解了自定义函数的一些限制后,很容易就可以写出如下代码。下面的代码中,我们定义了 printA 函数,它的参数为空,也没有返回值,仅仅是打印出一个字母 “A”。我们在 codeblocks 里执行它,发现程序在控制台中打印出了字母 A。

关于 codeblocks 的安装和使用,可点击我的主页,查看相关文章。以后如果想打印 A,只需要执行 printA 函数就可以了。更进一步的,我们自己定义的 printA 函数也可以当做系统函数(例如)一样嵌套使用,请看如下代码:我们又新定义了一个函数 print2A,它的功能就是在控制台打印两个 A。

在 codeblocks 里执行,发现与预期一致。体会从上面的简单例子中,可以总结出以下信息:同一个函数可以调用多次。可以用一个函数去调用另一个函数,第二个函数可以去调用第三个函数。调用自定义的函数,是通过我们取的名字调用的,例如 main 函数中调用 print2A();函数可以使代码更简洁,原本打印两个 A 需要两行代码,现在只需要 print2A 一行就可以了。

你可能会说,我定义 print2A 就用了 5 行啊,哪里简洁了。可是,以后只要遇到需要打印两个 A 的地方,我都可以调用 print2A,如果有 10 个地方需要打印两个 A 呢?另外,如果有一天,我想在打印两个 A 的时候不换行,那我只需要修改 printA,把里面的 “\n”删掉就可以了,而不用去找那 10 个需要打印两个 A 的地方逐个修改。

读代码和读文章不一样,按从上到下从左到右的顺序读代码未必是最好的。比如上面的例子,按顺序应该是先看 printA 再看 print2A 再看 main。不过,如果换一个角度,按代码的执行顺序来读也许会更好:因为 main 是入口函数,所以第一句要执行的就是 print2A 函数,那它是什么功能呢?于是目光移到 print2A 函数,它的第一句是 printA 函数,于是进入 printA 函数。

奥,知道了 print2A 先要打印一个 A,然后又要执行 printA 函数,又打印了一个 A。这下知道了,main 函数里的第一句要打印两个 A。实际上,在很多大型项目中,要熟悉它的代码结构,第一件事往往就是找到入口函数。欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

文章TAG:定义函数指针函数语言

最近更新