通过实战理解C语言精要——函数篇

本文为作者原创,转载请注明出处,感谢您的阅读与分享,希望本文能让您有所收获。

前言

本篇博客是对C语言函数部分的重点内容和细枝末节通过实战得到的经验的总结精炼,不涵盖C语言函数的全部内容,所有提炼内容均来自提炼与实战,阅读需要对函数部分有一定基础,可用于对C语言函数的理解提升和备考复习,理解本文有助于您解决C语言函数部分的题目,获得只有通过实战才能加深理解的经验。

大家都大致都了解一点数学意义上“函数”的概念,比如“y=f (x)”,且不论f的具体形式如何,其基本特点是“对一个x,有一个y值与之对应”。C语言中,“函数”是个重要的概念,是模块化编程的基础。

什么是函数?—根据输入进行处理返回输出。

函数精要与细枝末节

1.函数概念

函数的别称是方法,函数也就是完成某一特定功能的模块,main函数是C程序的入口点,有且仅有一个main函数。

2.函数的执行流程
函数调用必须等待函数执行完成才会执行下一步。

3.库函数与自定义函数

库函数:
由C语言系统提供;
用户无须定义,也不必在程序中作类型说明;
只需在程序前包含有该函数定义的头文件;
自定义函数:
用户在程序中根据需要而编写的函数;

4.函数在VS编译器中的特点

函数名在VS里可以参杂中文

C语言参数过多会警告,多的会忽略,结果不保证正确,C语言保证尽量类型一致,个数一致。

C语言函数不return返回可以编译,但是结果自负。

C语言函数一定要加声明,加了声明一定不会出错,不加声明有可能出错,声明可以有多个,定义只能有一个,理论上一定要加声明。

VS2013的编译器,默认的配置了静态库lib的路径。

C语言编译比较宽泛,有库的路径,可以自动定位,不需要函数声明;C++必须有函数声明,头文件,库文件。

std标准库,C语言标准跨平台。

可以用abort()函数来处理程序的异常。

5.函数的返回值就是函数的输出,函数的结果

main函数可以没有返回值,无论类型是int还是void。

C非main函数如果不是void,会有一个警告,如果是CPP会是一个错误。

6.return后面得语句不会再被执行
main函数的return语句就是退出,没有return,main函数执行完所有语句就会退出

7.函数的形参与实参

函数调用的时候,形参分配内存,新建一个变量,存储传递过来的实参。函数调用之前,形式参数,也就是函数定时时()里的参数,值都不确定,不确定的值,不会分配内存,只有调用函数的时候,才会分配内存新建一个变量,接受实际参数的值,当函数调用结束的时候,形参占据的内存会被回收。实际参数是函数调用的时候,函数传递的确切值就是实际参数,实际参数可以是常量,变量或者表达式。形参与实参内存地址不一样,占用不同的内存空间。

形式参数与实际参数的类型,会自动完成数据类型的转换,调用函数的时候,尽量类型要匹配,否则会出现误差或错误。

8.局部变量与全局变量

局部变量:局部变量调用完成以后会被回收,局部变量是为块语句服务的,函数内部定义的变量,还有函数的参数,都是局部变量

全局变量:全局变量不属于任何一个函数,可以被任何一个函数调用,全局变量的生存期就是程序的生命期,全局变量会一直占内存,而局部变量用完就扔。

全局变量可以用于函数的通信,同名的情况下,局部变量会屏蔽全局变量。

C++可以用::访问全局变量,C语言不可以。同一个块语句下变量不可以重名,可以再装一个块语句。

int a; //全局变量声明,没有初始化默认为0,有的话就是默认的值
int a=9; //全局变量定义,只能有一个

全局变量,跨文件都可以调用
如果重名,局部变量会屏蔽全局变量,内部块语句变量会屏蔽外部变量
全局变量,很容易被覆盖,很容易被读写

局部变量没有声明与定义的区别

int add(int ,int ); //声明的变量名可以省略,要加分号,声明要与定义匹配

9.输入输出函数

putchar(); //按字符打印
getchar(); //等待你输入一个字符,返回值就是你输入的字符

10.函数声明与定义

C语言从上往下开始编译,所以上面如果没有函数的定义,或者声明就无法找到函数,无法调用。

函数的实体只能有一个,函数的声明,只是说明函数的存在,所以可以有多个。

C++属于严格的编程语言,函数的声明必须在调用之前

11.函数是模块化编程的基础,函数解决代码重用的问题

函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用。

12.函数的块语句不允许省略

函数体内部变量不可以与参数同名

参数传递是单向值传递

(void) 参数为空

函数的默认类型是int,可以省略

13.函数的副本机制

函数除了数组外,都是副本,副本机制通过赋值,赋值会自动类型转换。return也会完成类型转换

14.字符串输入输出

%i等价于%d,打印有符号十进制数据

gets();  //输入一个字符串到字符串变量
getchar(); //等待你输入一个字符的作用

sleep()函数在windows.h头文件里

15.函数的执行顺序:

从下往上进栈,从上往下执行。

16.函数参数运算顺序:

从右面的参数开始算 (int a,int b) 先计算b的值,再计算a的值,从右往左

show(a,a++); //执行结果6,5

实战——可变参数函数的实现

1.int类型可变参数函数实现:

#include<stdarg.h> // 标准参数
    int add(int num,...) //...代表可变参数

{
    int res=0; //结果
    va_list argp; //存储参数开始的地址
    va_start(argp,num); // 从首地址开始,读取num后面的数据
    for(int i=0;i<num;i++)
{
    res+=va_arg(argp,int); //读取一个数据按照int类型解析
}
    va_end(argp); //结束读取
    return res;
}

2.字符串类型可变参数函数实现:

void go(int num,...)
{
    va_list argp; //存储参数开始的地址
    va_start(argp,num); // 从首地址开始,读取num后面的数据

    for(int i=0;i<num;i++)
    {
        char str[50];
        sprintf(str,"%s",va_arg(argp,char *));
        system(str); //读取一个数据按照char *解析
    }
    va_end(argp); //结束读取
}

3.如果是参数的个数也不知道情况:

void showint(int start,...)
{
    va_list argp; //存储参数开始的地址
    va_start(argp,start); // 从首地址开始,读取num后面的数据
    int argvalue=start; //第一步初始化

    do
    {
        printf("\n%d",argvalue);
        argvalue=va_arg(argp,int); //不断读取
    }while(argvalue!=-1);
    va_end(argp); //结束读取
}            
时间: 2024-08-22 18:29:36

通过实战理解C语言精要——函数篇的相关文章

《JavaScript语言精粹》—— 函数篇

三.函数 (1) 函数对象 在JavaScript中,函数就是对象.对象字面量产生的对象连接到Object.prototype.函数对象连接到Function.prototype(但其实该对象原型也是连接到Object.prototype).每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码(在JavaScript创建一个函数对象时,会给对象设置一个"调用属性"). 每个函数对象在创建时也会配送一个prototype属性.它的值是一个拥有constructor属性且值

Oracle SQL语言之常用函数_超越OCP精通Oracle视频教程培训30

Oracle SQL语言之常用函数_超越OCP精通Oracle视频教程培训30 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第5/5套:Oracle SQL语言之常用函数.主要学习Oracle数据库SQL聚合函数,分组函数,字符函数,转换函数,日期字符数字转换,日期函数,集合函数,分析函数等. Oracle SQL语言之常用函数,课程内容详细如下: 聚合函数-数据统计 分组函数-使用group by与havin

C语言可变参数函数实现原理

一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本文地址:http://www.cnblogs.com/archimedes/p/variable-parameter.html,转载请注明源地址. 例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x200

【转载】理解C语言中的关键字extern

原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻译了一下.(原文:http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/)   我确定这篇文章对c语言的初学者会有很大的帮助,因为这将使他们更好更熟练的使用c语言.所以就让我先来说说extern关键字在变量和函数上的应用.最基本

理解C语言声明的优先级规则

A 声明从它的名字开始读取,然后按照优先级顺序依次读取. B 优先级从高到低依次是:    B.1 声明中被括号括起来的那部分    B.2 后缀操作符:         括号()表示这是一个函数,而         方括号[]表示这是一个数组.    B.3 前缀操作符:星号*表示 "指向-的指针". C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符.在其他情况下,const和(或)volatile关键字作用于它左边

用三分钟理解c语言sizeof

一.概念 sizeof是单目操作符,同++等操作符一样.作用是以字节形式输出操作对象所在储存大小. 二.用法 a.操作数据类型 如sizeof(int),输出int类型在内存中所占的字节长度,具体取决于具体环境,本机输出为4. b.操作变量 如 char a[6]; printf("%d\n" ,sizeof(a)),因为已经定义了char数组长度,所以输出值为6. 三.常见问题 有以下几个例子,需要引起注意: 例子1: int testSizeOf(char x[]) { retur

C语言数组和函数实例练习

C语言的数组和函数部分的知识,在语法上和Java语法是有所相似的,这里只通过实例总结一些自己感觉需要理解的部分知识. 1.数组 数组中的元素具有相同的数据类型:数组一旦创建,不能被改变:数组中元素在内存中是连续依次存在的:使用时需要随时注意下标越界的问题. 例1:输入数量不确定的[0,9]范围内的整数,统计每个数字出现的次数,输入-1时结束程序. #include <stdio.h> #include <stdlib.h> int main() { int i; int num[1

深入理解C语言的函数调用过程 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4240084.html 原文地址:深入理解C语言的函数调用过程 作者:wjlkoorey258 本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解.    先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include <stdio.h> int foo1(int m,int n,int p) { int x = m + n + p; ret

C语言学习笔记--函数

1. C 语言中的函数 (1)函数的由来: 程序 = 数据 + 算法→C 程序 = 数据 + 函数 (2)模块化程序设计 (3)C 语言中的模块 2. 面向过程的程序设计 (1)面向过程是一种以过程为中心的编程思想 (2)首先将复杂的问题分解为一个个容易解决的问题 (3)分解过后的问题可以按照步骤一步步完成 (4)函数是面向过程在 C 语言中的体现 (5)解决问题的每个步骤可以用函数来实现 3. 声明和定义 (1)声明的意义在于告诉编译器程序单元(以下均指变量或函数)的存在 (2)定义则明确指示