C/C++函数,库函数简介,函数参数,传址调用,函数声明定义方法,函数的使用,仿函数

函数

c语言是面相过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
c++是基于面相对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
函数大体上可以分为库函数和自定义函数。

  • 函数参数的压栈顺序从右至左,出栈顺序从左到右。
  • C是怎样进行函数调用的:每一个函数调用都会分配函数栈,在栈内进行函数执行过程。
  • C++如何处理返回值:
    非引用类型:生成一个临时变量,
    引用返回:返回指向函数调用前就已经存在的对象的引用是正确的。
    返回const引用:不希望返回的对象被修改时,返回const引用是正确的。

函数的声明和定义

1>声明

1.函数声明一般放在头文件中。
2.函数一般满足先声明后使用。
3.告诉编译器函数叫什么,参数是什么,返回类型是什么。

//函数Add的声明test.h放置函数声明
#ifndef __TEST_H__
#define __TEST_H__
int Add(int x,int y);
#endif //__TEST_H__
2>定义

指函数的具体实现,交代函数的功能实现。

//函数Add的实现test.c放置函数的定义
#includ"test.h"
int Add(int x, int y)
{
	return x + y ;
}

函数的参数

1>实际参数

实际参数是函数调用的时候传给函数的变量。(可以是变量,常量,表达式,函数)。

2>形式参数

只有在函数被调用时才分配内存,调用结束销毁。(指函数名后括号内的变量)

3>参数的调用

根据参数被调用时所传类型不同,分为传值调用和传址调用。

//(1)传值调用,形参的修改不影响实参
void Swap1(int x, int y)
{
	int tmp = 0 ;
	tmp = x ;
	x = y ;
	y = tmp ;
}
//(2)传址调用(一级指针传参),通过指针而修改实参
void Swap2(int *px, int *py)
{
	int tmp = 0;
	tmp = *px;
	*px = *py;
	*py = tmp;
}
int main()
{
	int num1 = 1;
	int num2 = 2;
	Swap1(num1, num2);
	printf("swap1::num1 = %d num2 = %d\n", num1, num2);
	Swap2(&num1, &num2);
	printf("swap2::num1 = %d num2 =%d\n", num1, num2);
	system("pause");
}
>小节

(1)传值调用:&num1 = 0x0043f898,&x = 0x0043f7b4,实参num1和num2和形参x,y使用的不是同一块地址空间。
(2)传址调用:&num1 = 0x0043f898,px = 0x0043f898,&px = 0x0043f7b,形参px,py是指向num1和num2的地址。

库函数

1>I/O函数

标准输入输出函数与(定义于stdio.h):
1.printf("<格式化字符串>",<参量表>);
2.*int sprintf(char *buffer , const char format ,[argument]…);
把格式化的字符串输出到指定字符串,
(1)buffer:是char类型的指针,指向写入的字符串指针。
(2)format:格式化字符串,即在程序中想要的格式%s。
(3)argument:可选参数,可以为任意类型的数据。
3.*fprintf(char File,const char format,[argument]…);
把格式化字符串输出到指定文件中,所以参数比printf多了个文件指针
File,那是目标文件的文件描述符(文件流指针)。
格式化输入函数(定义于stdio.h)
scanf("<格式化字符串>",<参量表>);
输入输出格式表

字符输入输出格式
%d有符号10进制数(%ld长整型,%hd短整型).
%i和%d没有区别,%i是老式写法.
%u无符号10进制数(%hu无符号短整型,%lu无符号长整型)
%o无符号8进制数.
%x/X无符号16进制数字,并以小/大写表示(lx对应的long型).
%f输入输出为浮点型(%lf双精度浮点型).
%s输入输出为字符串.
%E/e用科学表示格式的浮点数.
%c输入输出为单个字符.
%p打印地址.
其它含义
%m.ns只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
%m.ne输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格
%±nd正数表示要右对齐,在数据左边操作;负数表示左对齐,在数据右边进行操作
2>字符函数&字符串操作函数

1.strlen//求字符串长度
size_t strlen(const char * str );

(1)字符串已经'\0'作为结束标识,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')。
(2)参数指向的字符串必须要以'\0'结束。
(3)注意函数的返回值为size_t,是无符号。

2.长度不受限制的字符串函数
(1)strcpy//字符串拷贝
char strcpy(char * destination,const char * source)*;

"1"源字符串必须以'\0'结束。
"2"会将源字符串中的'\0'拷贝到目标空间。
"3"目标空间必须足够大,才能确保能存放源字符串。
"4"目标空间必须可变。

(2)strcat//字符串拼接
char * strcat(const char * str1, const char * str2);

"1"源字符串必须以'\0'结束。
"2"目标空间必须足够大,能容纳下源字符串内容和目标字符串的相加结果。
"3"目标空间必须可修改。
"4"字符串自己给自己追加。

(3)strcmp//字符串比较
int strcmp(const char * str1,const char * str2);

"1"第一个字符串大于第二个字符串,则返回大于0的数字。
"2"第一个字符串等于第二个字符串,则返回0。
"3"第一个字符串小于第二个字符串,则返回小于0的数字。

3.长度受限制的字符串函数
(1)strncpy
char * strncpy( char * destination ,const char * source ,size_t num);

"1"拷贝num个字符从源字符到目标空间。
"2"如果源字符的长度小于num,则拷贝完源字符串之后,在目标空间后面追加0,直到num个.

(2)strncat
char * strncat( char * destination,const char source, size_t num);
(3)strncmp
char * strncmp( const char
str1,const char * str2, size_t num);
4.字符串查找
(1)strstr
char * strstr(const char *, const char *);
(2)strtok
char * strtok( char * str,const char *sep);

1>sep参数是个字符串,定义了用作分隔符的字符集合。
2>第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3>strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针.(strtok函数会改变被操作的字符串,所以在使用strtok函数切分字符串一般都是临时拷贝的内容,并且可修改)。
4>strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5>strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6>如果字符串不存在更多的标记,则返回NULL指针。

5.错误信息报告
strerror //返回错误码,必须包含头文件errno.h。
6.字符操作

3>内存操作函数

1.memcpy
void * memcpy(void * destination,const void *source, size_t num);

(1)函数memcpy从source的位置开始向后复制num个字节数据到destination的内存位置。
(2)这个函数在遇到'\0'时并不会停下来。
(3)如果source和destination有任何的重叠,复制的结果都是未定义的。

2.memmove
void * memmove(void * destination,const void *source, size_t num);

(1)memmove和memcpy的区别是:memmove可以处理源内存块和目标内存块是可以重叠的。
(2)如果源空间和目标空间重叠,必须使用memmove。

3.memcmp //比较ptr1和ptr2指针开始的num个字节
int memcmp(const void * ptr1,const void * ptr2, size_t num);

4>其它库函数

时间/日期函数,数学函数…

自定义函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。

仿函数

在这里插入图片描述

函数的使用

1>嵌套调用

函数和函数之间可以有机组合的使用。

2>链式访问

一个函数的返回值作为另一个函数的参数。

3>递归

程序调用自身的编程技巧称为递归(recursion)。主要思考方式是:大事化小。
1.存在限制条件,当满足这个限制条件的时候,递归便不在继续。
2.每次递归调用之后越来越接近这个限制条件。
3.递归层次不能太深,容易出现栈溢出。

3>迭代

迭代是重复反馈过程的活动,为了接近目标或结果,每一次迭代得到的结果会作为下一次迭代的初始值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值