zoukankan      html  css  js  c++  java
  • 恼人的函数指针(一)

    原文链接:http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html

    这篇是为了加深记忆所写。

    发现。非常多知识若不经过重复的琢磨和动手实践。是非常难记得住的。

    1)  函数指针的初始化

    函数例如以下:

    int CompareString(const string& str1, const string& str2)
    {
        return str1.compare(str2);  

    }

    函数的初始化有两种方式:

    第一种。也是最普遍的方式:

    int (*CompareFunction)(const string&, const string&) = CompareString;

    另外一种,是使用typedef定义函数类型,这样的写法有助于对代码的理解:

    typedef int (*CompareFunctionType)(const string&, const string&);
    CompareFunctionType CompareFunction = CompareString;

    2)  函数指针赋值。

    函数名能够理解为该类型函数的指针。当然,取地址操作符作用于函数名上也能产生指向该类型函数的指针。也就是说以下两种赋值都是可行的:

    CompareFunctionType CompareFunction = CompareString;
    CompareFunctionType CompareFunction = &CompareString;

    3)  函数调用。

    不管是用函数名调用,还是用函数指针调用,还是用显式的指针符号调用,其写法是一样的:

    CompareString("abc""cba");
    CompareFunction("abc""cba");
    (*CompareFunction)("abc""cba");

    4)  函数指针的数组。

    对于函数指针的数组。强烈建议使用typedef方式定义类型之后再使用。不然影响代码的阅读性。继续以以上样例为例:

    //without typedef
    int (*CompareFunctionArray[3])(const string&, const string&);
    //with typedef
    CompareFunctionType CompareFunctionTypeArray[3];

    5)  函数指针用做函数返回值的类型。

    到这一步,会发现typedef是多么的好用了。不然我是全然读不懂以下语句的意思的:

    //without typedef
    int (*func(int*, int))(const string&, const string&);

    上面的声明。将func(int*, int)声明为一个函数,返回值为函数指针。函数类型为int (*)(const string&, const string&)。

    多么的晦涩啊。

    假设写成typedef就不用这么纠结了。足见typedef的作用:

    CompareFunctionType func(int*, int);

    6)  指向extern "C"函数的指针。

    《C++ primer 3》中有指出,指向C函数的指针和指向C++函数的指针类型不同。可是如今的非常多编译器都有语言扩展。觉得这两种函数的指针具有同样的特性。

    所以,我在vs 2010中做了尝试,结果证明是支持这样的语言扩展的。

    函数声明例如以下:

    复制代码
    extern "C" int InsideFunctionC(const string& str1, const string& str2)
    {
        return str1.compare(str2);
    }

    int InsideFunctionCPlusPlus(const string& str1, const string& str2)
    {
        return str1.compare(str2); 

     }

    复制代码

    函数指针的初始化和调用,同意赋值为指向C函数的指针:

    int (*CompareFunction)(const string&, const string&) = InsideFunctionC;

    另外另一点。当extern "C"应用在一个声明上时,全部被它声明的函数都将受到影响。举个样例:

    extern "C" void OutSideFunction(int (*fc)(const string&, const string&))
    {
        cout<<fc("abc""cba")<<endl;;
    }

    这里的OutSideFunction和fc都将受到extern "C"的影响,可是vs2010编译器是支持一个指向C++函数的指针作为OutSideFunction的參数。

    例如以下:

    复制代码
    int main()
    {
        OutSideFunction(InsideFunctionC);
        OutSideFunction(InsideFunctionCPlusPlus);
        
        return 0

    }

    复制代码

    到此就差点儿相同了。昨天看了一遍。今天又写博客温习了一遍。应该算是加深记忆了。傻笑一个。


  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5215814.html
Copyright © 2011-2022 走看看