C++的函数与指针

 更新时间:2021年10月29日 09:59:06   作者:uncle_ll  
今天小编就为大家分享一篇关于C++函数与指针的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

函数与指针

一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。在C++中, 函数名代表函数的入口地址。

  • 指针作函数的参数-实现地址传递
  • 返回指针的函数
  • 利用指向函数的指针调用函数

指针作函数的参数-实现地址传递

指针作函数的参数,具有以下用途:

  • 指针作函数参数,这时形参接受的是实参的地址。函数中通过对指针的间接访问实现参数的按“引用传递”功能
  • 设置多个指针参数可从函数中带回多个结果值
  • 对于传递一块连续的内存区域数据,传递首地址比传递数

据值不仅开销小而且效率高

例如:

编写交换两个变量值的函数(地址传递)

相当于改变两个指针指向的变量内容。

void swap(int *px, *py)
{
	int t;
	t = *px;
	*px = *py;
	*py = t;
}
int main()
{
	int x=2, y=3;
	cout<<"调用前:x="<<x<<",y="<<y<<endl;
	swap(&x, &y);
	cout<<"调用后:x="<<x<<",y="<<y<<endl;
	return 0;
}

/*
输出:
调用前:x=2, y=3
调用后:x=3, y=2
*/

在这里插入图片描述

例如:

利用指针参数带回函数中的多个值

计算一维数组元素的平均值,并能带回数组中的最大值与最小值

函数原型设计如下:

double faver(int s[], int n, int *max, int *min);
其中:
s-一维数组
n-数组中元素个数
max-指向最大值
min-指向最小值
将平均值作为函数的返回值

double faver(int s[],int n,int *max,int *min)
{
	double aver=s[0];
	*max= *min =s[0];
	for(int i=1;i<n;i++)
	{ aver+=s[i];
	if(s[i]>*max)*max=s[i];
	if(s[i]<*min)*min=s[i];
	}
	return aver/n;
}
int main()
{
int a[5]={80,89,67,76,98}, max, min;
double aver;
aver=faver(a,5,&max,&min); //调用函数
cout<<"max="<<max<<"\n"<<"min="<<min<<endl;
cout<<"aver="<<aver<<endl;
return 0;
}
/*
max=98
min=67
aver=82
*/

返回指针的函数

返回指针的函数定义格式如下

类型 * 函数名(形式参数表)
{
   语句序列
}

其中:

类型 * 为函数的返回值类型,是一个指针类型

例子

编写函数,返回字符串中首次出现的非空格字符开始的字符串

如:" using namespace std;" 返回"using namespace std;"

char * noblank(char * str)
{
	while(*str == ' ')
		str++;
	return str;
}
int main()
{
	char *s1 = "    using namespace std;", *s2;
	s2 = noblank(s1);
	cout << s2 << endl;
	return 0;
}

指向函数的指针变量

使用指向函数的指针变量可以存放函数的指针

指向函数的指针变量定义格式如下:

函数返回值类型 ( * 指针变量名 ) (形参类型表列);

注意,中间的括号不能省略

例如:

定义指向double型函数的指针变量,该函数有一个double型参数

double (*pf)( double );
pf=sqrt; //pf 指向一个平方根函数

时,使用*pf可以调用该函数。

cout<<(*pf)(2.0)<<endl; //输出根号2的值
与 cout<<sqrt(2.0)<<endl; 表示式是等价的

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • VC实现给窗体的一个按钮添加事件的方法

    VC实现给窗体的一个按钮添加事件的方法

    这篇文章主要介绍了VC实现给窗体的一个按钮添加事件的方法,通过三个简单步骤实现窗体按钮添加事件,需要的朋友可以参考下
    2015-05-05
  • 深入理解C++函数栈帧

    深入理解C++函数栈帧

    本文主要介绍了C++函数栈帧,详细的介绍了C++函数栈帧的概念以及使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++保存HBITMAP为位图文件的实现方法

    C++保存HBITMAP为位图文件的实现方法

    这篇文章主要介绍了C++保存HBITMAP为位图文件的实现方法,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2021-01-01
  • c语言static关键字用法详解

    c语言static关键字用法详解

    大家好,本篇文章主要讲的是c语言static关键字用法详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C语言面试常见考点排序总结

    C语言面试常见考点排序总结

    深处开发岗,其实排序也是绕不开的环节,其中冒泡排序,选择排序,插入排序,归并排序,快速排序,堆排序也是我在秋招以来频繁问到的技术点,今天我们来重点聊聊排序
    2021-11-11
  • C++ boost thread库用法详细讲解

    C++ boost thread库用法详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C/C++的内存管理你了解嘛

    C/C++的内存管理你了解嘛

    这篇文章主要为大家介绍了C/C++的内存管理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 关于C++中虚拟继承的一些总结分析

    关于C++中虚拟继承的一些总结分析

    虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用
    2013-09-09
  • MFC程序中使用QT开发界面的实现步骤

    MFC程序中使用QT开发界面的实现步骤

    本文主要介绍了MFC程序中使用QT开发界面的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 一文教你Qt如何操作SQLite数据库

    一文教你Qt如何操作SQLite数据库

    Sqlite 数据库作为 Qt 项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一。本文为大家介绍了Qt操作SQLite数据库的具体方法,希望对大家有所帮助
    2023-03-03

最新评论