首页/文章/ 详情

C++函数基础概念

2天前浏览117
   

概述

       

为了程序的模块化管理,任何计算机语言都会设计函数,将多次执行的程序封装为函数,以供任何时候调用。下面介绍C++中的函数使用。

函数简介

     

数据类型就是前文讲解的内容,经常使用的数据类型有:int、float等等,函数名称的命名与变量名称的命名要保持相同的法则,函数名后面开括号里的内容是调用函数的参数。

依据输入和输出的类型,C++函数可以大致分为以下几类





有输入,有输出有输入,无输出无输入,有输出无输入,无输出
 

一个函数的完整使用过程,不但包括函数的具体定义,还要在主程序main函数之前进行声明,如






#include<iostream>using namespace std;
\\函数声明输出类型 函数名称(参数1,参数2...)
int main(){
\\函数调用
return 0;}
\\函额具体定义输出类型 函数名称(参数1,参数2...){
程序语句
return 函数返回值;}
 

下面依次介绍这几种函数

有输入,有输出

       

设计一个简单的数学函数,这个函数分为三个阶段,x在不同的阶段y有不同对应的函数值,如




y=x-1         x<0y=x^2         x>=0 && x<10y=x^3         x>+10
 

对应的C++程序为






#include<iostream>#include<string>
using namespace std;double subroutine(double x);
int main(){  double x = 0;  cout << "Please input X:\t" << endl;  cin >> x;  cout << "The Y is:\t" << subroutine(x) << endl;
 system("pause");  return 0;}
double subroutine( double x){
 if (x<0){    return x - 1;  }  else if (x >= 0 && x < 10){    return x*x;  }  else{    return x *x*x;  }
}
 

上面的程序首先向屏幕请求一个输入,然后将用户输入的数值传入函数中,函数判断x的范围并进行相应的计算,当输入的数值为56时,输出的内容为




Please input X:56The Y is:       175616
 

有输入,无输出

       

这里设计一个函数,这个函向屏幕输出许多行字符,输出的行数是通过参数传进来,这个函数不向主程序返回任何数值,只是向屏幕输出以字符,如






#include<iostream>#include<string>
using namespace std;void subroutine(int x);
int main(){  int x = 0;  cout << "输入行数:\t" << endl;  cin >> x;  subroutine(x);
 system("pause");  return 0;}
void subroutine( int x){  for (int i = 1; i <= x; i++){
   cout << "第"<<i<<"行,共计"<<x<<"行。\n" << endl;  }  
}
 

上面的程序接受一个整型参数,这个参数数值就是函向屏幕输入的字符串行数,当输入的数值为8时,输出的结果为


















输入行数:81行,共计8行。
2行,共计8行。
3行,共计8行。
4行,共计8行。
5行,共计8行。
6行,共计8行。
7行,共计8行。
8行,共计8行。
 

无输入,有输出

       

下面的函数没有接接受输入,但是向主程序返回了一个整型的数值,并将该数值赋值给一个整型变量,并且向屏幕输出了结果






#include<iostream>#include<string>
using namespace std;
\\define functionint subroutine();
int main(){  int output = 0;  \\call subroutine  output=subroutine();  cout << output << endl;
 system("pause");  return 0;}
\\define functionint subroutine(){  cout << "这是一个无输入但是有数值输出的函数!" << endl;  cout << "这个函数输出的数值内容为:" << endl;  return 23;
}
 

上面的函数输出结果为




这是一个无输入但是有数值输出的函数!这个函数输出的数值内容为:23
 

无输入,无输出

       

无输入也无输出的函数定义为





void functionname(){\\codes}
 

这种函数声明方式,不需要在函数中添加代码return,只需要设置输出类型为void即可。

设置无输入也无输出函数也可以采用如下方式






int functionname(){\\codesreturn0;}
 

上面代码将函数输出类型设置为int,而且在函数程序中添加了return 0,这意味着程序会返回一个0数值,这也是可行的。同样的道理,也可以





string functionname(){return "";}
 

这就返回了一个空的字符串,也是可行的。

下面给出了一个无输入也无输出的函数示例



















#include<iostream>#include<string>
using namespace std;void subroutine();
int main(){  subroutine();
 system("pause");  return 0;}
void subroutine(){  cout << "这是一个没有输入,也没有数值输出的函数。" << endl;  cout << "这个函数仅仅向屏幕输出了这两句话。" << endl;
}
 

运行上述程序,只会向屏幕输出两句话,而没有任何的数值输出,输出结果为



这是一个没有输入,也没有数值输出的函数。这个函数仅仅向屏幕输出了这两句话。
 

函数与数组的联合使用

       

函数不但可以用来接收一些简单的数据,还可以接收数组和指针类型的数据,这里介绍一个接收数组类型的函数例子

假设要计算一个班级里面所有人一学期的签到次数,就需要创建一个数组,数组的索引就是第几个人,数组的数值就是一个人签到的次数,这里假设一个班级里面有8个人,设计如下程序






#include<iostream>using namespace std;
const int people = 8;
int sum(int arr[],int n);//第六行代码改成这样也是可以运行的,int sum(int [],int );
int main(){
 int data;    //班级里面每个人额签到次数  int arr[8] = {1,2,3,4,5,6,7,8};    //调用函数  data = sum(arr, people);
 cout << "班级里所有人签到的总次数为:\t"<<data<< endl;
 system("pause");
 return 0;}
int sum(int arr[], int n){  int m = 0;  for (int i = 0; i < n; i++)  {    m += arr[i];  }  return m;}
 

注意第七行的注释,将int sum(int arrr[],int n)修改为 int sum(int [], int)也是可以正确运行的,这是因为函数原型中的参数不需要准确的变量名称,只需要知道数据类型就行。

关于函数、数组和指针的应用,会更加的有意思,下一部分帖子会重点讲解指针与数组的内容。

     
     


       

来源:有限元先生
SystemUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-09-25
最近编辑:2天前
外太空土豆儿
硕士 我们穷极一生,究竟在追寻什么?
获赞 2粉丝 0文章 2课程 0
点赞
收藏
作者推荐

C++指针与数组基础概念

零概述 指针是C/C++学习的核心,可以说是C/C++语言的明珠,所有的计算机编程语言中,只有C/C++有指针,如果能把指针运用得当,就算是把C/C++两种编程语言都精通了,但是精通指针是一件相当困难的事情。这个帖子只是简单的介绍一下指针和数组的基本概念,供大家参考,只能算是把读者引入门。指针更复杂的应用需要查看专业的书籍。壹指针 内存是一系列地址连续的储存区域,就像是一个个小房间 ,房间号是连续的,为了方便读取和写入数据,设计者通过给储存区域设置地址来进行数据的操作就像是连续的房间号,但是直接操作地址并不是一件简单的事情,因为内存里的地址是十六进制的数字,因此当我们声明一个变量时候,编译器会开辟一段内存区域,如 这个内存区域与我们声明的变量类型是对应的,这就是C++声明变量要非常严格的原因,我们给变量赋值的时候,编译器会自动的将数据放到变量所对应的内存区域,这样就完成了数据的读写。这就意味着,普通变量变量是为了方便索引地址,而普通变量变量对应的地址中,储存着数值。即普通变量储存的是数值。指针同样是一种数据类型,相对于变量储存的是数值本身,而的指针储存的则是变量的地址。指针为变量提供了一种极其高效的处理方法是,通过地址索引能够大大提高程序的运行速度。指针的声明方式为\\指针对应d额地址储存d额数值类型 *指针名称;int *p=NULL; \\声明了一个整型指针,该指针储存d的地址中保存的是整型数据类型\\初始声明将该指针设置为没有任何指向 下面程序简要介绍了一下指针的基本运算# include&lt;iostream&gt;#include&lt;string&gt;using namespace std;int main(){ int data = 10; \\声明一个整型变量 int *p = NULL; \\声明一个整型指针,初始值为空 p = &amp;data; \\将data的地址赋值给整型指针 cout &lt;&lt; &quot;data的地址为:\t&quot; &lt;&lt; &amp;data &lt;&lt; endl; \\*P把指针指向d的地址储存的数值提取出来 \\这种操作方法被成为指针的解引用 \\指针的解引用相当于直接提取变量的数值 cout &lt;&lt; &quot;指针指向的地址储存的数值为:\t&quot; &lt;&lt; *p &lt;&lt; endl; cout &lt;&lt; &quot;data变量的数值为:\t&quot; &lt;&lt; data &lt;&lt; endl; system(&quot;pause&quot;); return 0;} 上面程序用到了C++中的取地址符号“&amp;”,这个符号能获取C++语言中任何变量的地址,甚至是函数的地址,上面程序输出的内容为data的地址为: 00EFFBAC指针指向的地址储存的数值为: 10data变量的数值为: 10 可以看到,指针的解引用确实相当于直接输出了变量的数值。上面的程序只是简单的介绍了指针的基本声明和取地址内容,是指针内容的九牛一毛,当指针和函数、结构体等功能结合在一起的时候,指针的威力才能完全的发挥出来。下面介绍下C++中数组的使用方法,以及指针与数组的关系。贰数组 数组就是储存同一类型数据的容器,可以储存int、float、double和char等等数据,数组的声明方式为//数据类型 数组名称[数组元素个数];int data[10]; //10个整整型数据的数组float data[90]; //90个单精度浮点数d额数组】double data[34]; //34个双精度浮点型数据的数组 数组和指针有着很紧密的关系,在C++中,数组的名称就是一个地址,可以直接输出出来,也可以将数组的名称(地址)赋值给其他的指针,就可以通过指针对数组进行访问,每移动一个指针,指针指向的地址就会移动一个整型单位,因此可以通过指针输出数组的内容,下面的程序采用两种方式对数组进行输出# include&lt;iostream&gt;# include&lt;string&gt;using namespace std;int main(){ int data[10] ; int *p = data; //将数组的开始位置赋值给指针 //数组的名称即为数组开始地址 cout &lt;&lt; &quot;数组起始位置的地址(data)为:&quot;&lt;&lt;data&lt;&lt; endl; cout &lt;&lt; &quot;数组起始位置的地址(p)为:&quot; &lt;&lt; p &lt;&lt; endl; for (int i = 0; i &lt; 10; i++){ data[i]=i*2; } //通过数组索引数组数值 cout &lt;&lt; &quot;通过数组索引数组数值:&quot;&lt;&lt; endl; for (int i = 0; i &lt; 10; i++){ cout &lt;&lt; &quot; data[&quot;&lt;&lt;i&lt;&lt;&quot;]=\t&quot; &lt;&lt; data[i] &lt;&lt; endl; } cout &lt;&lt; &quot;通过指针索引数组数值:&quot; &lt;&lt; endl; //通过指针索引数组数值 for (int i = 0; i &lt; 10; i++){ cout &lt;&lt; &quot; *(P+&quot; &lt;&lt; i &lt;&lt; &quot;]=\t&quot; &lt;&lt; *(p+i) &lt;&lt; endl; } system(&quot;pause&quot;); return 0;} 程序运行的结果为数组起始位置的地址(data)为:012FFD98数组起始位置的地址(p)为:012FFD98通过数组索引数组数值: data[0]= 0 data[1]= 2 data[2]= 4 data[3]= 6 data[4]= 8 data[5]= 10 data[6]= 12 data[7]= 14 data[8]= 16 data[9]= 18通过指针索引数组数值: *(P+0]= 0 *(P+1]= 2 *(P+2]= 4 *(P+3]= 6 *(P+4]= 8 *(P+5]= 10 *(P+6]= 12 *(P+7]= 14 *(P+8]= 16 *(P+9]= 18 可以发现,数组的名称确实是一个地址,但是需要注意,程序每次运行数组的位置不是固定的,因为编译器每运行一次程序就会重新给数组分配一次内存地址。后面分别采用指针和数组索引的两种方式输出数组的数值,两种方式输出的结果是相同的。下面再给出一个采用指针操作字符串数组的例子#include&lt;iostream&gt;#include&lt;string&gt;using namespace std;int main(){ //初始化字符串 string data=&quot;introduction&quot;; //声明一个指向字符额指针 char *p = NULL; //初始化指针为空 //采用数组索引的方式输出字符串 cout &lt;&lt; &quot;采用数组索引的方式输出字符串&quot;&lt;&lt; endl; for (int i = 0; i &lt; sizeof(&quot;introduction&quot;) / sizeof(char); i++){ cout &lt;&lt; data[i] &lt;&lt; &quot;\t&quot;; } cout &lt;&lt; endl; //换行 //将字符串的第一个字符地址赋值给指针 p = &amp;(data[0]); //采用指针的形式输出字符串 cout &lt;&lt; &quot;采用指针索引的方式输出字符串&quot; &lt;&lt; endl; for (int i = 0; i &lt; sizeof(&quot;introduction&quot;) / sizeof(char); i++){ cout &lt;&lt; *(p+i)&lt;&lt; &quot;\t&quot;; } cout &lt;&lt;endl; //换行 system(&quot;pause&quot;); return 0;} 上面的程序先声明了一个字符串数组“introduction”,后声明了一个指向字符的指针,注意这里的指针没有指向字符串,因为我们想要操控字符,二而不是字符串。然后采用数组的方操控字符串。下面将字符串中第一个字符的地址赋值给之前声明的指针,注意这里并没有直接将字符串数组的名称赋值给指针,这与整型数组不同,这里的字符串名称并不是地址,因此需要将字符串数组第一个字符的地址赋值给指针。后续采用指针操控字符串数组,输出的结果对比如下采用数组索引的方式输出字符串i n t r o d u c t i o n采用指针索引的方式输出字符串i n t r o d u c t i o n 二者的输出是完全相同的。叁指针、数组和函数联用 设计数组求和的例子,使用了指针、数组和函数三种工具,目的是学习函数之间传递指针的用法。这里我们采用两种计算方法,一种是直接在函数之间传递数组,另一种是在函数之间传递指针,首先展示的例子是在函数之间传递数组,如#include&lt;iostream&gt;using namespace std;const int people = 8;//直接传递数组int sum(int [],int );int main(){ int data; int arr[8] = {1,2,3,4,5,6,7,8}; data = sum(arr, people); cout &lt;&lt; &quot;班级里所有人签到的总次数为:\t&quot;&lt;&lt;data&lt;&lt; endl; system(&quot;pause&quot;); return 0;}int sum(int arr[], int n){ int m = 0; for (int i = 0; i &lt; n; i++) { m += arr[i]; } return m;} 上面第七行的函数原型,里面的参数是数组本身,后面具体的函数定义中,也是直接将数组所有的数值传递进函数中进行求和计算,最终计算的结果是36 下面采用传递指针的方式给数组求和,如# include &lt;iostream&gt;#include &lt;string&gt;using namespace std;//函数原型中的参数是指针int sum(int *, int);int main(){ int ar[8] = {1,2,3,4,5,6,7,8}; int *p; p = ar; cout &lt;&lt; sum(ar, 8) &lt;&lt; endl; system(&quot;pause&quot;); return 0;}int sum(int *p, int n){ int i; int op=0; for (i = 0; i &lt; n; i++) { op += *(p + i); } return op;} 上面程序中第七行函数原型int sum(int *,int) 表明了传入函数的第一个参数是一个指向整型对的指针,第二个参数是数组的数量。在具体的函数定义中int sum(int *p, int n){ int i; int op=0; for (i = 0; i &lt; n; i++) { op += *(p + i); } return op;} 按照指针的方式进行索引数组,指针没移动一次,移动的距离就是指针指向的数据类型的大小,数组一共有n个元素,则指针一共移动n次,最终的计算结果为36 上面两种数组求和分别向行数传递了数组和指针,这二者是有很大区别的,因为C++是传值的,这意味着当向函数传递一整个数组的时候,编译器需要更大的缓存空间,而传递指针则不同,一个整型纸指针占用的储存空间位置为4个字节,这就对大大缩小了编译器申请的缓存空间,这在大型计算中的优势极为明显。下面同样给了一个函数接收字符型指针数据访问数组的例子#include&lt;iostream&gt;#include&lt;string&gt;using namespace std;void fun_pointer(char *, int);void fun_array(char [], int);int main(){ char str[] = &quot;introduction&quot;; int len; char *p; len = strlen(str); // 计算字符串长度 p = str; //将字符型指针赋值给指针 cout &lt;&lt; &quot;采用指针访问字符串数组。&quot;&lt;&lt; endl; fun_pointer(p, len); cout &lt;&lt; &quot;直接访问数组。&quot; &lt;&lt; endl; fun_array(str, len); system(&quot;pause&quot;); return 0;}//void fun_array(char str[], int n){ for (int i = 0; i &lt; n; i++) { if (i == n-1) { cout &lt;&lt; str[i] &lt;&lt; &quot;\t&quot; &lt;&lt; endl; } else { cout &lt;&lt; str[i] &lt;&lt; &quot;\t&quot;; } }}//void fun_pointer(char *p, int n){ for (int i = 0; i &lt; n; i++) { if (i ==n-1) { cout &lt;&lt;*(p+i)&lt;&lt;&quot;\t&quot;&lt;&lt; endl; } else { cout &lt;&lt; *(p + i) &lt;&lt; &quot;\t&quot;; } }} 分别直接和采用指针访问数组,输出的结果为采用指针访问字符串数组。i n t r o d u c t i o n直接访问数组。i n t r o d u c t i o n 肆总结 C/C++中的指针是一个非常强大的工具,它允许我们直接在低智商对数据进行字节程度的操作,这是其他所有的编程语言都做不到的。可以看到,指针编程的思考方式与变量计算的方式完全不同,指针的操作与完全基于计算机硬件的内存操控思路来的,指针记录了内存中的地址,一切的操作都是基于地址的,这极大地方便了数据的读写。但是,强大的工具必然是双刃剑,指针对使用者的计算机硬件基础与编程功底有着极高的要求,上面所有的例子仅仅是科普水平,指针就像是一把蝴蝶刀,使用不好,会对内存导致意想不到的后果轻则程序崩溃,重则系统出问题,指针的使用要慎之又慎,指针的学习要从一而终,永无止境。深入学习指针的使用是十分有必要的。 来源:有限元先生

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈