C语言随笔5:函数、函数指针

qingsongzdq 2020-01-28

函数

C语言中函数参数传递时,将实参的值拷贝到函数参数的存储区中。这种传递参数的方式称为按值传递

函数不会访问实参本身,访问的是函数存储在栈区的副本,不会改变实参.函数凋用结束,函数在栈区的内容释放.

若要改变实参本身.需用指针传递待修改变量的地址,使函数参数保存该变量地址的值。然后在函数中,通过参数保存的地址间接访问待修改的变量。大部分书籍,将这种做法称为按址传递或按引用传递。实际上,这种传递方式仍然是按值传递,只不过传递的是地址的值。

非void的函数,返回值不能做为左值.

因为函数返回值是常量,不是变量.

数组传递给函数:

不会保留数组的副本,保留的是数组首地址.的副本

常常有另一个参数一起传递进去,数组的末尾地址或者数组的长度。

函数指针:

存储函数首地址的指针变量.

函数名可以表示函数首地址.即表示函数的入口.

常作为函数的参数使用.

初始化办法:

Int f(char ,double)

Int (*p)(char, double ) =f;

//指针与函数需返回类型一致 int

//需参数列表一致 char double

int array[10] = {0};

int less1(int,int);//排序方式1

int greater(int,int);//排序方式2

int less2(int,int);//排序方式3

void sort(int*,int,(*)(int,int));

 sort(array,10,less1)  //int*   int类型地址=int数组名,(*)(int,int)  两个int参数的地址=两个int参数的函数名 ,表示地址

        //或将使用指针数组,初始化各个排序方式名字,再传参调用

 sort(array,10,greater)

 sort(array,10,less2)

函数的调用和递归

主调函数、被调函数

函数调用发生时,

主调函数的信息会作为一条活动记录入栈(瑞萨调试工具中可以看到过多层、后入先出)

活动信息:返回值,自动局部变量,函数名等

函数调用结束会将控制权返回给主调函数。

函数总能在多层嵌套的栈中找到其主调函数的信息

递归函数:直接或者间接调用自己的函数称为递归函数

内存分配:

注意 ‘返回栈内存’ 错误:

错误例:

u8 ex()

{

int p =233;

return p;

}

 p是局部变量,在栈中,在外部调用时,局部变量的值已经销毁,返回一个无效值。

(可能跟编译器有关系,待确定

相关推荐