Heim >Backend-Entwicklung >C#.Net-Tutorial >C++-Funktionen und Zeiger

C++-Funktionen und Zeiger

炎欲天舞
炎欲天舞Original
2017-08-03 16:56:151919Durchsuche

Ich habe kürzlich C++ Primer Plus gelesen und finde, dass das Kapitel über Funktionen und Zeiger schwieriger ist.

Aus C++ Primer Plus: Kapitel 7 Funktion: C++-Programmiermodule

1. Wie deklariere ich einen Funktionszeiger?

ähnelt einem Funktionsprototyp: Sie müssen einen Zeiger deklarieren, der auf den Rückgabewert und die Parameterliste der Funktion

<br>

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 Automatische Typinferenz

<br>

 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. Zeigernamen als Funktionsnamen verwenden

<br>

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

4. Array von Funktionszeigern

<br>

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. Zeiger auf Array von Zeigern

Array von Zeigern und Der Unterschied zwischen Array-Zeigern

<br>

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

Zeiger auf Array

<br>

<br>
1 auto pc = &pa; //&pa ist die Adresse des gesamten Arrays, pa ist die Adresse des ersten Elements des Arrays

2

3 const double * (*(*pd)[3] )(const double *, int ) = &pa; //Entspricht dem ersten

4

5 **&pa = *pa = pa[0]

Code:

<br>

//arfupt.cpp -- an array of function pointers
#include<iostream>
//various notations,same signatures
const double *f1(const double ar[],int n);
const double *f2(const double [],int);
const double *f3(const double *,int);

int main()
{
    using namespace std;
    double av[3] = {1112.3,1542.6,2227.9};

    //pointer to a function

    const double *(*p1)(const double *,int) = f1;
    auto p2 = f2;//C++ 11 utomatic  type deduction
    //pre-C++11 can use the following code instead
    //const double *(*p2)(const double *,int) = f2;
    cout<<"Using pointers to functions:\n";
    cout<<"Address Value\n";
    cout<<(*p1)(av,3)<<":"<<*(*p1)(av,3)<<endl;
    cout<<p2(av,3)<<":"<<*p2(av,3)<<endl;

    //pa an array of pointers
    //auto doesn&#39;t work with list initialization
    const double *(*pa[3])(const double *,int) = {f1,f2,f3};
    //pb a pointer to first element of pa
    auto pb = pa;
    // pre-C++11 can use the following code instead
    // const double *(**pb)(const double *, int) = pa;
    cout<<"\nUsing an array of pointers to functions:\n";
    cout<<"Address Value\n";
    for(int i = 0;i < 3; i++)
        cout<<pa[i](av,3)<<":"<<*pa[i](av,3)<<endl;
    cout<<"\nUsing a pointer to a pointer to a function:\n";
    cout<<"Address Value\n";
    for(int i = 0;i < 3; i++)
        cout<<pb[i](av,3)<<":"<<*pb[i](av,3)<<endl;

    //what about a pointer to an array of function pointers
    cout<<"\nUsing pointers to an array of pointers:\n";
    cout<<"Address Value\n";
    //easy way to declare pc
    auto pc = &pa;
    // pre-C++11 can use the following code instead
    // const double *(*(*pc)[3])(const double *, int) = &pa;
    cout<<(*pc)[0](av,3)<<":"<<*(*pc)[0](av,3)<<endl;
    //hard way to declare pd
    const double *(*(*pd)[3])(const double *,int) = &pa;
    //store return value in pdb
    const double *pdb = (*pd)[1](av,3);
    cout<<pdb<<":"<<*pdb<<endl;
    //alternative notation
    cout<<(*(pd)[2])(av,3)<<":"<<*(*(*pd)[2])(av,3)<<endl;
}

const double * f1(const double * ar, int n)
{
return ar;
}
const double * f2(const double ar[], int n)
{
return ar+1;
}
const double * f3(const double ar[], int n)
{
return ar+2;
}

Das obige ist der detaillierte Inhalt vonC++-Funktionen und Zeiger. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn