一.知识点总结
一.函数
1.函数定义
数据类型 函数名(形参类型 形参)shuo
{
函数体
}
注:
1. 函数的数据类型是函数的返回值类型(若函数的返回值类型为void ,则无返回值)
2. 形参表可以为空,也可以有多个形参,用逗号隔开。不管有无参数,括号不能省略。
3. 形参必须有类型说明,且数据类型需逐一说明。可以是变量名,数组名,指针名。
4. 函数体:说明语句,执行语句。也可以只有语句,没有类型说明。也可以为空,但花括号不能省略。
5. 如果自己定义的函数和库函数重名,自己定义的函数优先级更高
2.函数调用
函数名(实参表)
实参表与形参表相对应
实参可以是常量,变量(有确定值),表达式。
3.函数声明
在调用前声明这个函数的原型:类型标识符 函数名(形参表);
二.三种参数传递方式
1.按值传递
例:求1!+2!+3!+4!+.....+n!
#include<bits/stdc++.h>
using namespace std;
int js(int);
int main()
{
int i,s=0,p;
cin>>p;
for(i=1;i<=p;i++)
s+=js(i);
cout<<s<<endl;
return 0;
}
int js(int n)
{
int m=1,j;
for(j=1;j<=n;j++)
m*=j;
return m;
}
注:
1. return 只能返回一个值。返回值多于一个,需用地址传递或引用传递。
2. 实参赋值给形参后,与自定义函数无关:被调用函数本身不对实参进行操作!即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。
例:#include<iostream>
usingnamespace std;
voidswap(int,int);
intmain()
{
int a = 3, b = 4;
cout << "a = " << a<< ", b = " << b << endl;
swap(a,b);
cout << "a = " << a<< ", b = "<< b << endl;
return 0;
}
voidswap(int x, int y)
{
int t = x;
x = y;
y = t;
}
输出结果仍为a = 3,b = 4,没有发生交换
2.引用传递
引用含义:类型名&引用名=某变量名; (相当于该变量的一个别名)
引用传递方式是在函数定义时在形参前面加上引用运算符“&”。
例:#include <iostream>
using namespacestd;
void swap(int&,int&);
int main()
{
int a = 3, b = 4;
cout << "a = " << a<< ", b = " << b << endl;
swap(a,b);
cout << "a = " << a<< ", b = "<< b << endl;
system("pause");
return 0;
}
void swap(int &x,int &y)//相当于&x=a,&y=b;
{
int t = x;
x = y;
y = t;
}
注:
1. 定义引用时一定要将其初始化成引用某个变量(&x=a),不初始化编译不过
2. 引用只能引用变量,不能引用常量和表达式
3.地址传递
……指针变量
1. 形式:类型标识符 *变量名 // *:指针说明符
2. 其内容为地址(存储位置) 的变量,简称指针。它所指向的地址上存放的变量称作目标变量
int i; &i:2000H // &:求地址运算
3. 指针变量赋值:(1)int i,*p;
p=&i;
(2) int i;
int *p=&i;
4. 一个指针变量只能指向同一类型的变量。即整型指针变量只能指向整型数据的地址,而不能放其它类型数据的地址。
5. 说明变量时:*变量名: 指针变量 int *p;
&变量名:引用变量 int &x=y;
正常语句中: *变量名:取内容 y=*p;
&变量名: 取地址 p=&x;
6. 绝对不能对未赋值的指针变量作“取内容”运算。
7. 指针的运算:++(--):指向下一个(或上一个)同种类型的数据
8. 变量作函数参数传递的是具体值,指针作函数参数传递的是内存的地址
9. 用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化
10. 函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值
……
……
地址传递
如果在函数定义时将形参说明成指针,调用函数时就需要指定地址值形式的实参。这时的参数传递方式就是按地址传递方式
例:#include <iostream>
using namespace std;
void swap(int*,int*);
int main()
{
int a = 3, b = 4;
cout << "a = " << a << ", b ="<< b << endl;
swap(&a,&b);
cout << "a = " << a << ", b ="<< b << endl;
system("pause");
return 0;
}
void swap(int *x,int *y)
{
int t = *x;
*x = *y;
*y = t;
}
三.数组与指针
1. C++规定:数组名就是数组的起始地址;又规定:数组的指针就是数组的起始地址。数组元素的指针就是数组元素的地址。
2. 数组名代表数组首元素的地址。
用数组名作函数的参数,传递的是数组首元素的地址
3.赋值:(1)int a[10]; (2) int *p=&a[0];
int *p=a;
4.C++规定,p+1指向数组的下一个元素,而不是下一个字节
5. *++p=2;
*++a=2;(错误)a为常量,不可赋值。
6.*(a+i)=a[i]
*(p+i)=p[i]
7.参数(1)形参实参都用数组名: f(int arr[ ], int n)
f(array,10);
(2)形参用指针变量: f(int *x, int n )
实参用数组名: f(a, 10);
(3)形参实参都用指针变量:f(int *x, int n )
f(p,10);
(4) 形参为数组名: f(intx[ ], int n )
实参为指针变量: f(p, 10);
二.题型总结
1.按值传递
#include<bits/stdc++.h>
using namespace std;
int zi(int m)
{
int t=2;
while(t<=floor(sqrt(m))&&(m%t!=0))
t++;
if (t>floor(sqrt(m)))
return 1;
else
return 0;
}
int main()
{
int n,a;
cin>>n;
for (int i=1;i<=n/2;i++)
{
a=n-i;
if (zi(a)&&zi(i))
cout<<n<<"= "<<i<<" + "<<a<<endl;
}
return 0;
}
2.引用传递
#include <iostream>
using namespacestd;
void swap(int&,int&);
int main()
{
int a = 3, b = 4;
cout << "a = " << a<< ", b = " << b << endl;
swap(a,b);
cout << "a = " << a<< ", b = "<< b << endl;
system("pause");
return 0;
}
void swap(int &x,int &y)//相当于&x=a,&y=b;
{
int t = x;
x = y;
y = t;
}
3.地址传递
#include <iostream>
using namespace std;
void swap(int*,int*);
int main()
{
int a = 3, b = 4;
cout << "a = " << a << ", b ="<< b << endl;
swap(&a,&b);
cout << "a = " << a << ", b ="<< b << endl;
system("pause");
return 0;
}
void swap(int *x,int *y)
{
int t = *x;
*x = *y;
*y = t;
}
4.数组与指针
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int x[]={1,2,3};
int s,i,*p;
s=1; p=x;
for (i=0;i<3; i++)
s*=*(p+i);
cout<<s<<endl;
}
三.学习心得
函数使得程序变得更简洁。将部分执行过程放在主函数之外,使主函数变得简洁。函数就是把一个复杂问题分解成一个或几个简单的小问题,将主函数中的重复问题单独写成小程序,用的时候直接调用,不必重复写,减小空间以及编写程序的时间。
按值传递比较简单,引用就相当于一个别名,地址就有点麻烦,使用的时候有时会有点乱,需要多练习一下