百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

C++|函数与指针:简单了解函数指针和指针函数

citgpt 2024-07-10 14:44 9 浏览 0 评论

函数指针是指指向一个函数的指针(pointer to function),如:

int (*pf)(int);

上面的代码要按运算符的优先级去理解,()的优先级最高,所以上面*pf加上前面的int表示是一个int指针的声明,后面跟的(int)表示是函数,则int (*pf)(int)是指一个int类型的函数指针,

C++|函数与指针:简单了解函数指针和指针函数

指针函数是指一个返回指针的函数,如:

int *pf(int);

1 函数指针

程序运行时,代码和数据都是分类存储在内存的不同区块中,所以函数也如同数据一样,有其内存地址,其内存地址可以被赋值给一个指针,这样的指针就叫函数指针。

#include <iostream>
using namespace std;
int f1(int);
int (*pf)(int);
int main()
{
	pf = f1;
	int x = f1(4);
	int y = (*pf)(4);
	cout<<x<<" "<<y;
	cin.get();
	return 0;
}
int f1(int n)
{
	return n*n;
}

int y = (*pf)(4);也可以写成:

int y = pf(4);

函数指针最经典的应用就是用作函数参数进行调用,这样一个使用函数指针做参数的函数就能灵活调用不同的函数。

2 指针函数

指针函数首先是一个函数,是一个返回指针的函数,如以下的指针函数的声明:

int * f1(int ar[], int n);

以下两个写法效果相同:

int * f1(int [], int n);

int * f1(int *, int n);

如何写一个指向指针函数的函数指针呢?

int *(*pf)(int *, int n) = f1;

以下是一个指针函数的使用实例:

附代码1:

#include <iostream>
double betsy(int);
double pam(int);
// second argument is pointer to a type double function that
// takes a type int argument
void estimate(int lines, double (*pf)(int));
int main()
{
 using namespace std;
 int code;
 cout << "How many lines of code do you need? ";
 cin >> code;
 cout << "Here's Betsy's estimate:\n";
 estimate(code, betsy);
 cout << "Here's Pam's estimate:\n";
 estimate(code, pam);
 cin.get();
 cin.get();
 return 0;
}
double betsy(int lns)
{
 return 0.05 * lns;
}
double pam(int lns)
{
 return 0.03 * lns + 0.0004 * lns * lns;
}
void estimate(int lines, double (*pf)(int))
{
 using namespace std;
 cout << lines << " lines will take ";
 cout << (*pf)(lines) << " hour(s)\n";
}

附代码2:

#include <iostream>
char * buildstr(char c, int n);
int main()
{
 using namespace std;
 int times;
 char ch;
 cout << "Enter a character: ";
 cin >> ch;
 cout << "Enter an integer: ";
 cin >> times;
 char *ps = buildstr(ch, times);
 cout << ps << endl;
 delete [] ps; // free memory
 ps = buildstr('+', 20); // reuse pointer
 cout << ps << "-DONE-" << ps << endl;
 delete [] ps; // free memory
 cin.get();
 cin.get();
 return 0;
}
// builds string made of n c characters
char * buildstr(char c, int n)
{
 char * pstr = new char[n + 1];
 pstr[n] = '\0'; // terminate string
 while (n-- > 0)
 pstr[n] = c; // fill rest of string
 return pstr; 
}

-End-

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: