【C++】函数和指针

最近在看C++ primer plus,感觉函数与指针这一章难点比较多,记写笔记,加强理解.

From C++ Primer Plus: Chapter 7 Function:C++ Programming Modules

1. 如何声明函数指针?

和函数原型类似: 需要声明指针指向函数的返回值和参数列表

double pam(int); //参数为int 类型,返回值为double 类型的函数
double (*pf);(int)  //指向参数为int类型,返回值为double 类型的指针
pf = pam;   //函数名代表了函数的地址

double x = pam(4); //函数名调用
double x = (*pf)(4); //指针调用
double x = pf(4); //C++也允许将指针名当作函数名使用

2. C++ 11 自动类型推断

const double * f1(const double *, int);

const double * (*p1)(const double *, int); //p1 poitns to f1
auto p2 = f1; //C++11 automatic type deduction,p2 points to f1 as well

3. 将指针名当作函数名使用

//前面函数为double *类型,cout第一部分返回double指针,第二部分返回double指针指向的值
cout<<(*p1)(av,3)<<":"<<*(*p1)(av,3)<<endl;
//和上面的cout一样只不过是使用函数指针名来调用函数
cout<<p2(av,3)<<":"<<*p2(av,3)<<endl;

4.  函数指针数组

const double *(*pa[3]) (const double *,int) = {f1,f2,f3}; //创建函数指针数组
//通过指针调用函数,得到返回的指针
const double *px = pa[0](av,3); //call by pointer as if it were a function name
const double *py = (*pa[0])(av,3); //正常调用

//得到函数返回指针指向的值
double x = *pa[0](av,3);
double x = *(*pa[0])(av,3);

5. 指向指针数组的指针

指针数组和数组指针的区别

*pd[3] //an array of 3 pointers
(*pd)[3] //a pointer to an array of three elements

指向数组的指针

1 auto pc = &pa;   //&pa是整个数组的地址, pa是数组第一个元素首地址
2
3 const double * (*(*pd)[3])(const double *,  int ) = &pa; //和第一个等价
4
5 **&pa = *pa = pa[0]

代码:

 1 //arfupt.cpp -- an array of function pointers
 2 #include<iostream>
 3 //various notations,same signatures
 4 const double *f1(const double ar[],int n);
 5 const double *f2(const double [],int);
 6 const double *f3(const double *,int);
 7
 8 int main()
 9 {
10     using namespace std;
11     double av[3] = {1112.3,1542.6,2227.9};
12
13     //pointer to a function
14
15     const double *(*p1)(const double *,int) = f1;
16     auto p2 = f2;//C++ 11 utomatic  type deduction
17     //pre-C++11 can use the following code instead
18     //const double *(*p2)(const double *,int) = f2;
19     cout<<"Using pointers to functions:\n";
20     cout<<"Address Value\n";
21     cout<<(*p1)(av,3)<<":"<<*(*p1)(av,3)<<endl;
22     cout<<p2(av,3)<<":"<<*p2(av,3)<<endl;
23
24     //pa an array of pointers
25     //auto doesn‘t work with list initialization
26     const double *(*pa[3])(const double *,int) = {f1,f2,f3};
27     //pb a pointer to first element of pa
28     auto pb = pa;
29     // pre-C++11 can use the following code instead
30     // const double *(**pb)(const double *, int) = pa;
31     cout<<"\nUsing an array of pointers to functions:\n";
32     cout<<"Address Value\n";
33     for(int i = 0;i < 3; i++)
34         cout<<pa[i](av,3)<<":"<<*pa[i](av,3)<<endl;
35     cout<<"\nUsing a pointer to a pointer to a function:\n";
36     cout<<"Address Value\n";
37     for(int i = 0;i < 3; i++)
38         cout<<pb[i](av,3)<<":"<<*pb[i](av,3)<<endl;
39
40     //what about a pointer to an array of function pointers
41     cout<<"\nUsing pointers to an array of pointers:\n";
42     cout<<"Address Value\n";
43     //easy way to declare pc
44     auto pc = &pa;
45     // pre-C++11 can use the following code instead
46     // const double *(*(*pc)[3])(const double *, int) = &pa;
47     cout<<(*pc)[0](av,3)<<":"<<*(*pc)[0](av,3)<<endl;
48     //hard way to declare pd
49     const double *(*(*pd)[3])(const double *,int) = &pa;
50     //store return value in pdb
51     const double *pdb = (*pd)[1](av,3);
52     cout<<pdb<<":"<<*pdb<<endl;
53     //alternative notation
54     cout<<(*(pd)[2])(av,3)<<":"<<*(*(*pd)[2])(av,3)<<endl;
55 }
56
57 const double * f1(const double * ar, int n)
58 {
59 return ar;
60 }
61 const double * f2(const double ar[], int n)
62 {
63 return ar+1;
64 }
65 const double * f3(const double ar[], int n)
66 {
67 return ar+2;
68 }
时间: 2024-10-02 14:04:16

【C++】函数和指针的相关文章

类的成员函数的指针

前面一篇文章<函数的指针 >介绍了全局函数的指针,现在我们再来介绍一下成员函数的指针. 成员函数指针的定义: 一般形式 Return_Type (Class_Name::* pointer_name) (Argument_List); 用typedef简化的形式 Typedef Return_Type (Class_Name::* FuncPtr_Type) (Argument_List); FuncPtr_Type pFunc = NULL; //pFunc为成员函数指针的指针变量 成员函数

成员函数指针和指向静态成员函数的指针

#include <iostream> using namespace std; class Student{ public:     Student(const string& name):m_name(name){}     void who(void){         cout << m_name << endl;     }     string m_name;     static int s_add(int a,int b){         re

类成员函数的指针与多态性

1 类成员函数的指针 2 类成员函数的指针数组 3 指向类成员函数的指针的指针 1 类成员函数的指针 auto func1 = &com::jia;//C++函数指针 int (com::*p)(int, int) = &com::jia;//C函数指针 1 #include <iostream> 2 3 class com 4 { 5 private: 6 int a; 7 int b; 8 public: 9 com(int x, int y) :a(x), b(y) 10

指针实现两数交换和指向函数的指针

指针就是地址,而指针变量就是存储地址的变量. 1.指针与函数 利用指针解决: C语言中函数的参数采用"单向传递",故第一个程序中改变形参不会改变实参,而在第二个程序中,使用指针变量作为参数,改变指针变量所指向的值,函数调用结束后,变量值被保留下来. 2.指向函数的指针的应用

函数和指针 C++

一.用函数指针变量调用函数. 指针变量也可以指向一个函数,一个函数在编译时被分配给一个入口地址.这个函数入口地址就称为函数的指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 定义指向函数的方法,格式是: int (*p)(int,int);     函数名代表函数入口地址,而max(a,b)则是函数调用. 二.返回指针值的函数 一个函数可以带回一个整数值.字符值.实型值等,也可以带回指针型的数据,即地址.其概念和以前类似,只是带回的值是指针类型而已.返回指针值的函数简称为指针函数

c++: 指向类成员函数的指针

指向函数的指针有和指向类成员函数的指针的有什么不同? int f(char a, float b);如果它是普通函数,则它的类型是 int (*)(char, float);如果它是非静态成员函数,则它的类型是 int(ClassName::*)(char, float);如果它是静态成员函数,则它的类型是和普通函数一样. 如何把一个类的成员函数传递给event handler, 线程启动函数等? 类的成员函数必须和一个类的实例结合起来才有意义.可以写一个函数来包装类的成员函数. class X

iOS指向函数的指针和block

  一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作为函数的参数传递: 与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用: 二:普通数据类型.指向函数的指针.block的定义的类比 1:基本数据类型: 例如:int a = 10; 格式:数据类型  变量名 = 值: 2:指向函数的指针:可以仿照上边基本数据类型的定义 例如:voi

c 函数及指针学习 10

标准库函数 1算数运算stdlib.h 2随机数stdlib.h 3字符串转化stdlib.h 4数学函数 math.h 5日期和时间 time.h 6信号 signal.h 7打印可变参数列表stdarg.h 8断言 assert.h 抽象数据类型在数据结构中比较仔细 运行时环境没看 来自为知笔记(Wiz)c 函数及指针学习 10,码迷,mamicode.com

数组、函数和指针

一.数组和指针 数组名同时也是该数组首元素的地址.例如:flizny == &flizny[0] , flizny 和 &flizny[0]都代表首元素的内存地址,两者都是常量: 指针+1的结果就是对该指针增加一个存储单元,对于数组而言,地址会增加到下一元素的地址,而不是下一个字节. 可以用以下等式表示: dates + 2 == &date[2] // 相同的地址 *(dates + 2) == dates[2] //相同的值 二.函数和指针 由于数组名就是数组首元素的地址,所以