零基础全日制function_第1页
零基础全日制function_第2页
零基础全日制function_第3页
零基础全日制function_第4页
零基础全日制function_第5页
已阅读5页,还剩13页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言—函数麦洛克菲—周扬荣面向对象和面向过程面向过程:procedure

oriented

programming

POP面向对象:object

oriented

programming

OOP面向过程是分析解决问题的步骤,然后用函数把这些步骤一步一步的实现,然后在使用的时候一一调用则可面向对象是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。下雨的时候,人们为了防止被雨淋打开伞避雨:面向过程:下雨了,我打开了伞,挡雨rain(雨);open(我,伞)prevent(伞,雨)面向对象:对象:我伞雨

行为:雨下,我打开伞,伞挡雨rain,me,umbrellarain.fall();me.open(umbrella)面向过程是把问题分解成若干步骤,每个步骤实现一个函数,一步步实现,然后在使用的时候,把数据传递给这些函数,计算得出结果面向对象是首先抽象出各种对象,把数据和解决问题的方法封装在对象中,然后各个对象之间通过行为发生作用函数(FUNCTION)定义在C语言中,把为了实现某一特定的功能的所有语句归纳在一起,就形成了一个函数。比如将两个数进行交换,求两个数中的最大数,将整数转换为字符串,这些功能都可以通过函数来实现。一般来说,函数只实现单一功能。如果一组代码是为了实现一个单一功能,则归纳出来,形成一个函数。比如求2个数中的最大值的语句如下:int

x;int

y;int

max;if

(x>y)

max

=

x;else

max

=

y;那么把这些语句归纳一下,就可以写成下面的函数:int

max(int

x,

int

y){int

max;if

(x>y)

max

=

x;else

max

=

y;return

max;}void

func(void){printf(“Hello

world\n”);return;}函数定义形式与调用int

add(int

x,

int

y){int

result

=

x+y;return

result;}int:返回值类型,void

add:函数名(命名风格:下划线或者单词第一个字母大写)x,y:参数--输入,输出,输入输出,变参函数,无参数用voidint

main(void){int

a

=

1;int

b

=

7;int

ret

=

0;ret

=

add(a,b);printf("ret:%d\n",

ret);}Main的参数int

_tmain(int

argc,

_TCHAR*

argv[]){}函数应用,多次与多重调用,头文件int

add(int

x,

int

y){int

tmp;tmp

=

x

+

y;returntmp;}int

GetMax(int

x,

int

y){int

max;if(x>y)max=x;else

max

=y;return

max;}void

print_x(int

x){printf(“%d\n”,

x);return;}void

print_hello(void){printf(“hello

world!\n”);}求最大值判断一年是不是润年求小写字母交换2个数函数定义注意事项功能单一一般不超过300行输入输出变量初始化严进宽出assert使用时间与空间复杂度边界考虑函数的功能测试return语句不可返回指向“栈内存”的“指针”或者

“引用”,因为该内存单元在函数体结束时被自动释放。模块化设计思想一个函数尽可能实现且只实现一个功能(不要把多个功能放在一个函数里)一个函数的长度1.包括版权版本声明、作者调试者测试者标注、函数说明及代码中的注释等等不超过200行2.纯代码行数不超过100行传参传值,无法改变实参void

Func1(int

x){x=1;//x是a的拷贝}传指针(传地址),可以改变实参void

Func2(int

*x){*x=2;//x是a的地址,*x就是a}传引用,可以改变实参void

Func3(int

&x){x=3;//x就是a}//为什么有3种传递方法?int

main(int

argc,

char*

argv[]){int

a=0;//a是实参

Func1(a);//传值

printf("%d\n",a);Func2(&a);//传指针

printf("%d\n",a);Func3(a);//传引用

printf("%d\n",a);printf("Hello

World!\n");return

0;}swap—交换void

swap1(int

x,

int

y)//传值{int

tmp=x;//x,y是a,b的拷贝

x=y;y

=

tmp;}void

swap2(int

*x,

int

*y)//传指针{int

tmp=*x;//x,y是a,b的地址*x=*y;//*x就是a,*y就是b*y

=

tmp;}void

swap3(int

&x,

int

&y)//传引用{int

tmp=x;//x就是a,y就是bx=y;y

=

tmp;}void

main(void){int

a

=

10;int

b

=

20;swap1(a,b);//传值

printf(“a=%d,b=%d\n”,a,b);a=10;b=20;swap2(&a,

&b);//传指针

printf(“a=%d,b=%d\n”,a,b);a=10;b=20;swap3(a,b);//传引用

printf(“a=%d,b=%d\n”,a,b);return;}数组做函数参数int

a[]int

(&a)[10]int

test_array(inta[],size_t

len){sizeof(a);}调用约定调用约定参数传递栈平衡调用约定类型cdeclstdcallfastcallthiscallnakedcall调用约定(CallingConvention)stdcall调用约定声明的格式,驱动默认的是stdcall调用约定:int

stdcall

func(int

x,inty)stdcall的调用约定意味着:参数入栈规则:参数从右向左压入栈还原栈者:被调用函数自身修改栈//默认的C调用约定//明确指出C调用约定int

func

(int

x

,inty)int

cdecl

func

(int

x,int

y)该调用约定遵循下面的规则:参数入栈顺序:从右到左cdecl调用约定又称为C调用约定,是C语言缺省的调用约定,它的定义语法是:还原栈者:调用者修改栈,所以可以支持变参函数,因为能够恢复栈平衡fastcall的声明语法为:int

fastcall

func

(int

x,int

y)该调用约定遵循下面的规则:参数入栈顺序:函数的第一个和第二个参数通过ecx和edx传递,剩余参数从右到左入栈还原栈者:被调用者修改栈thiscall是C++类成员函数缺省的调用约定,但它没有显示的声明形式。thiscall意味着:参数入栈:参数从右向左入栈this指针入栈:如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,

this指针在所有参数压栈后被压入栈。栈恢复:对参数个数不定的,调用者清理栈,否则函数自己清理栈。nakedcall…实际例子进一步学习缓冲区溢出-栈溢出void

msg_display(char

*

buf){char

msg[200];strcpy(msg,buf);cout<<msg<<endl;}局部变量区老ebp返回地址(eip)参数1…参数nebpesp栈增长方向内存增长方向思考?为什么传值不能改变实参,而传指针和引用可以

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论