zoukankan      html  css  js  c++  java
  • 函数声明与函数指针

    在C++中,函数声明形式为:返回值 函数名称(参数类型 参数名称, 参数类型 参数名称)
    其中参数名称可以省略不写,记得最后加分号!

    定义函数指针和函数声明有些类似,但有一点不同,在函数指针中,函数名为一个指针变量,如下例子中的(*p[2])为一个函数指针数组, 其中p[0] = &max, 相当于对max函数取别名!

    #include<iostream>
    #include<vector>
    using namespace std;
    
    int max(int a, int b) {
        return (a < b) ? b : a;
    }
    
    int add(int a, int b) {
        return a + b;
    }
    
    int main() {
    
        int (*p[2])(int, int);   // 定义函数指针
        int a, b, c;
        int res1, res2;
        int max(int, int);    // 函数声明
    
        p[0] = &max;
        p[1] = &add;
        cin >> a >> b >> c;
        res1 = (*p[0])((*p[0])(a, b), c);
        cout << res1 << endl;
        res2 = (*p[1])((*p[1])(a, b), c);
        cout << res2 << endl;
    
        system("PAUSE");
        return 0;
    }

    那在C++中,动态内存如何进行传递呢?

    在下面例子中,其中GetMemory1函数中出现了指针作为函数参数进行传递的形式!而指针传递和其他非引用传递一样,都会将实参拷贝出来一份进行传递,因此在函数中形参改变,而实参不改变!
    解决这个问题的方法有三种:

      • 使用指针的指针,char **p

      • 在C++中有了引用的符号,因此也可以对指针类型进行引用传递,char* &p

      • 可以利用函数返回值来进行传递(注意返回值是在堆区还是栈区!)

        #define _CRT_SECURE_NO_WARNINGS
        #include<iostream>
        #include<vector>
        using namespace std;
        
        //char* GetMemory0(int num) {
        //    char p[20];
        //    return p;
        //}     写法错误,返回的是堆栈地址,而堆栈地址在函数结束后会销毁
        
        //void GetMemory1(char* p, int num) {
        //    p = (char*)malloc(sizeof(char) * num);
        //}    这种写法错误,指针传递属于非引用传递,故函数内指针实为拷贝后完全不同的指针
        
        void GetMemory2(char** p, int num) {
            *p = (char*)malloc(sizeof(char) * num);
        }
        
        void GetMemory3(char* &p, int num) {
            p = (char*)malloc(sizeof(char) * num);
        }
        
        char* GetMemory4(int num) {
            char* p = (char*)malloc(sizeof(char) * num);
            return p;
        }
        
        int main() {
        
            char* str1 = nullptr;  // 创建指针必须初始化
            GetMemory2(&str1, 20);
            strcpy(str1, "HELLO");
        
            cout << str1 << endl;
        
            free(str1);
            str1 = nullptr;  // 指针free后要置空,防止出现野指针
            system("PAUSE");
            return 0;
        }
  • 相关阅读:
    2.Spring Boot 有哪些优点?
    3.什么是 JavaConfig?
    4.如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    Java中的异常处理机制的简单原理和应用。
    垃圾回收的优点和原理。并考虑2种回收机制。
    我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
    Request对象的主要方法:
    JSP的内置对象及方法。
    Servlet执行时一般实现哪几个方法?
    说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11736541.html
Copyright © 2011-2022 走看看