函数学习总结

一.知识点总结

一.函数

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;

}

      三.学习心得

函数使得程序变得更简洁。将部分执行过程放在主函数之外,使主函数变得简洁。函数就是把一个复杂问题分解成一个或几个简单的小问题,将主函数中的重复问题单独写成小程序,用的时候直接调用,不必重复写,减小空间以及编写程序的时间。

按值传递比较简单,引用就相当于一个别名,地址就有点麻烦,使用的时候有时会有点乱,需要多练习一下


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值