最最最最最最最最基础的C---函数

函数(定义、声明、调用)

函数定义:

返回值类型 函数名(参数表(形参:没有内存的):类型+参数名)

{

函数体;

}

函数分类:

从实现的角度:库函数与自定义函数(实现)

从参数表的角度:有参函数与无参函数(参数表)

从返回值角度:有返回值(函数体中必须有return)与无返回值(void)(返回值)

函数调用:

函数名(参数表:实参(任意的表达式))

要求:实参个数、类型、顺序与形参严格一致

函数调用的方式:

1.函数调用作为独立的语句:不要求函数带回值,只要求函数完成一定的操作

2.作为表达式的一部分:(函数的返回值)函数表达式

3.作为另外一个函数的实参(函数的返回值):函数参数

函数调用的流程:

1.系统给形参分配临时内存,把实参传给形参(用实参给形参初始化)

2.进入被调函数函数体,执行到return(带回一个返回值)或者函数块末尾.回到主调函数。3.系统回收形参(普通局部变量)的临时内存.

函数声明:返回值类型 函数名(参数表:形参表);

1.库函数不需要自己声明,引用头文件

2.自定义函数当函数定义在调用之后,需要声明

函数参数传递方式:值传递、址传递、引用传递

注意:

1.当通过函数参数改变主调函数中变量的值,址传递(实参是变量的地址)或引用传递

2.普通类型:址传递

类类型:引用传递

3.指针可以为空,址传递时,必须要判断指针是否为空,assert()判断

引用:(C++专属):给变量取别名;

定义:类型 &引用名;必须初始化(必须是变量名)

常引用:const int &refn;只读类型的引用

指针与引用的区别:

指针可以不初始化,引用必须初始化;

指针可以为NULL,但是引用不可能为NULL;

指针有自己独立内存,但是引用没有独立内存;

指针可以改变指向的,但是引用不能改变被引用对象

普通局部变量与普通全局变量

普通局部变量:定义在函数中的变量;(生存周期:从定义到这个函数结束)

普通全局变量:定义在函数外的变量;(生存周期:从定义到源文件结束)

作用域范围(访问)与生存周期(内存)

内存区域的划分(生存周期):

全局区:全局变量、静态变量static(编译时分配内存到程序结束)

栈区:普通局部变量(定义时分配内存,函数调用完毕)

堆区:程序员自己申请(malloc、new),由程序员自己手动释放(free、delete)

常量区:const 字符串()定义到程序结束

作用域范围(访问):

(普通)局部变量:当前的语句块{}

普通全局变量:当前项目的所有文件,在其他文件中访问需要extern声明

静态全局变量:当前文件

静态局部变量与普通局部变量:作用域范围相同,生存周期不同

静态全局变量与普通全局变量:生存周期相同,作用域范围不同;

static与const的用法

static可以修饰函数为内部函数,只能在本文件中被调用,其他源文件不能声明调用该函数。

static修饰的全局变量只能在本源文件中访问,其他源文件不能使用。

static还可修饰局部变量为静态局部变量,保存到静态存储区,下次再调用该函数时可以保留上一次的调用结果。

[cpp]view plaincopyprint?

#include<stdio.h>

voidstatictest1_1(int len){

auto int a = 0;

static int b = 0;

printf("a+len = %d+%d",a,len);

a +=len;

printf("=%d\t", a);

printf("b+len=%d+%d",b,len);

b +=len;

printf("=%d\n", b);

}

staticvoid statictest1_2(){

printf("static修饰的函数只能在本文件中被调用\n");

}

voidstaticmain(){

for(int i=0; i < 5; i++){

statictest1_1(i);

}

}

输出:

a+len= 0+0=0   b+len=0+0=0

a+len= 0+1=1   b+len=0+1=1

a+len= 0+2=2   b+len=1+2=3

a+len= 0+3=3   b+len=3+3=6

a+len= 0+4=4   b+len=6+4=10

由于a使用auto修饰表示动态分配内存,每次调用函数时a的内存都是动态分配和释放的,每次都初始化为0

而b使用static修饰,表示存放在静态存储区,一直到main程序结束才释放内存,当函数调用结束时还是可以保留b的值。只在第一次初始化,下次使用上一次的计算结果。

虽然用static修饰b,但b还是局部变量,其他函数不能访问到b

可计算1+2+3+4+.....+n和1*2*3*4*....*n

函数:参数(值传递,地址传递,引用传递)

函数参数:数组

形参:数组(或者用指向该数组的指针):弱化成指针(sizeof()=4,和其数组内的基本类型没有关系了),必须添加一个参数(形参)表示数组的大小

实参:数组名(传递数组首元素的地址),数组元素(个数)

参数缺省:一般函数声明时,给形参一个缺省值

缺省顺序:从右到左(只有右边的参数缺省,左边的参数才能缺省)

传参顺序:从左到右(当两个形参都有缺省值,但又传入了一个参数,那这个参数赋值给左边的形参)

函数重载(C++):函数名相同,参数不同

参数不同:个数不同,类型不同(一一对应比较),顺序不同

函数重载二义性:调用不明确

1.参数类型不匹配:给实参类型强转(和形参一致:注意只能从低精度转到高精度)

2.参数缺省:解决方法只能是参数不缺省

函数的返回值:指针

函数与指针:函数有连续内存的,函数名是首地址

函数指针:指向函数的指针

定义:返回值类型(*指针变量名)(形参表)

(用这个指针调用函数,称为回调函数)

指针函数:函数的返回值是指针

注意:指针函数不能返回栈区的内存(普通局部变量的内存)

函数的返回值:引用

注意:不能返回栈区的变量(局部变量的内存在函数调用结束时被回收)

函数调用可以作为左值(赋值运算符),此时运用的是引用定义里面的的别名(即变量名)

参数形参必须要是指针类型(或者引用)时,但是又不需要通过指针去修改指向内存中的值,该指针最好定义为常量指针(常量引用)加const

变量的存储类别

变量从变量作用域(空间角度)分全局变量和局部变量

从变量生存期(时间角度)分静态存储方式和动态存储方式

静态存储方式:程序运行期间由系统分配固定的存储空间的方式

动态存储方式:程序运行期间根据需要进行动态的分配存储空间的方式

内存用户区分为: 程序区,静态存储区,动态存储区

数据 存放在 静态和动态存储区;全局变量存放在 静态存储区

程序一开始执行,上述两者就已经被分配固定的存储单元

函数形参,自动变量,函数调用时的现场保护和返回地址存放在 动态存储区

以上数据在函数开始调用分配动态存储空间,函数结束释放空间

C中的变量和函数有两个属性:数据类型和数据的存储类别

存储类别:指数据在内存中的存储的方式。分为4中:

auto自动的,static静态的,register寄存器的,extern外部的

auto变量

函数中的局部变量,如果没有专门声明为static存储类别,则都是动态地分配存储空间的,数据存储在动态存储区中。这类局部变量称为自动变量,用关键字auto作存储类别的声明。

一般auto可省略,隐含为“自动存储类别”,属于动态存储方式

用static声明局部变量

有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即占用存储单元不释放。就必须用关键字static进行声明,定义为“静态局部变量”。static属于静态存储类别

static变量只赋初值一次,之后保留上次函数调用结束的值

register变量

对已一些使用频繁的局部变量,C允许其存放在CPU的寄存器中,需要时直接从寄存器中取出参加运算,不必再到内存中区存取,,提高效率。这样的变量叫做寄存器变量,用关键字register声明。

只有局部自动变量和形参可以作为寄存器变量。属于动态存储类别

用extern声明外部(全局)变量

用extern声明外部变量,是为了扩展变量的作用域

用static声明外部(全局)变量

用static声明外部变量,为了限制外部变量的作用域,只能在本文件中使用,称为静态外部变量

时间: 2024-10-18 16:44:59

最最最最最最最最基础的C---函数的相关文章

MYSQL养成记-MYSQL基础增强(Myql函数)

MYSQL基础增强(Myql函数) 在这里只介绍一些常用的,比较新颖的: 字符串函数: CONCAT://字符串连接函数mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> SELECT CONCAT('My', NULL, 'QL');//与null连接会变null -> NULL mysql> SELECT CONCAT(14.3); -> '14.3' CONCAT_WS://含分隔符的字符串连接mysq

Swift语法基础入门三(函数, 闭包)

Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: func 函数名称(参数名:参数类型, 参数名:参数类型...) -> 函数返回值 { 函数实现部分 } 没有参数没有返回值 可以写为 ->Void 可以写为 ->() 可以省略 Void.它其实是一个空的元组(tuple),没有任何元素,可以写成() func say() -> V

c#编程基础之字符串函数

c#常用的字符串函数 例一: 获取字符串的大小写函数 ToLower():得到字符串的小写形式 ToUpper():得到字符串的大写形式 注意: 字符串时不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串通过函数返回值的形式返回. 源码如下: using System; using System.Collections.Generic; using System.Text; namespace 字符串函数学习 { class Program { static void Mai

javascript语法基础-变量与函数

三 javascript语法基础-变量与函数 (一)变量的声明与运用 JavaScript中的变量与Java.C等强类型语言有很大区别,虽然在JavaScript中具有字符串.数字等数据类型. 变量申明语句的结构是var保留字加标识符,var和标识符之间用空格隔开. 赋值语句的结构是在变量和需要赋的值之间加上一个等号,例如a=1的含义是将变量a的值指定为1. 变量在定义的时候也可以同时赋值,如var a=1. PS:在变量使用前事先进行声明是个良好的编程习惯,这对将来学习Java等其他语言有帮助

MySQL基础学习之函数

数学函数 绝对值      abs() 圆周率      PI() 平方根 sqrt() 模除取余   mod(被除数,除数) 随机数      rand() 四舍五入    round(数字) 次方         pow(5,2) e为底的指数函数  exp(数字) 字符串函数 字符长度       length(字符) 字符连接       concat(字符1,字符2) 带符号的字符连接    concat_ws('-','su','zhou') 字符插入      insert('su

SQL基础语法和函数

SQL常用查询语句和函数 (2012-05-09 09:44:55) 转载▼ 标签: sql查询 函数 sql常用语句 it 分类: SQL SQL SELECT 语法 SELECT 列名称 FROM 表名称 SELECT LastName,FirstName FROM Persons --------------------------------------------------------------------------------- SQL SELECT DISTINCT 语句 在

基础常用JS函数和语法

100多个基础常用JS函数和语法集合大全 来源:http://www.cnblogs.com/hnyei/p/4605103.html 网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法: 1.输出语句:document.write(""); 2.JS中的注释为//3.传统的HTML文档顺序是:document->html->(head,body)4.一个浏览器窗口中的DOM顺序是:window->(navigator,scr

【C++ 基础 11】 函数指针总结

在家学习的效率真是惨不忍睹.. =========================== 1 指针函数 int* f(int a, int b); 返回一个指向int类型的指针. 2 函数指针 2.1 声明 返回类型 (*函数名)(参数列表); 2.2 示例 int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int (*f)(int, int); // 声

PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

<?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo "<br />"; echo "<hr />"; } say_hello();//函数调用 function say_helloS($some_name)//有参数 { echo "hello,".$some_name; echo

python 基础篇 11 函数进阶----装饰器

11. 前??能-装饰器初识本节主要内容:1. 函数名的运?, 第?类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ?. 闭包什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引?. 叫闭包 可以使用_clesure_检测函数是否是闭包  返回cell则是闭包,返回None则不是 闭包的好处: 由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函数访问的时间和时机就不?定了, 因为在外部,