IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> (一)函数与指针 -> 正文阅读

[C++知识库](一)函数与指针

1指针做函数的形参

指针变量可以做函数的形参,对应的实参用地址或指针变量。函数调用时传入的是数据的地址,因此形参和实参指向主调函数中的同一片内存空间,函数改变形参指向的变量的值,则对应实参指向的值也将改变。因此,尽管被调函数不能改变实参指针的值,但可改变实参指针所指变量的值。

2.返回指针值的函数

函数的返回值可以是指针,返回值类型是指针的函数也被称为指针函数。因本函数执行完毕返回主调函数后,函数中的局部变量将被全部释放,因此指针函数的返回值不能是本函数中的局部变量的地址。

3.指向函数的指针

程序运行时,一个函数包含的指令序列要占据一段内存空间,这块内存空间的首地址称为函数的入口地址,编译系统用函数名代表这一地址。函数的入口地址为函数的指针,简称函数指针。函数名是函数的指针常量,可以定义指针变量,用来存放函数的入口地址,这种存放函数入口地址的变量称为指向函数的指针变量,简称函数指针变量

用函数名调用函数称为函数的直接调用,用函数指针变量调用函数称为函数的间接调用。

一个函数指针变量只能指向某类函数中的一个,要求该函数的形参个数\类型\顺序相同且返回值类型也相同,只是函数名不同。

函数指针与普通类型变量指针本质相同,都是内存地址,区别是普通变量的指针指向内存中的数据区,函数指针指向内存中的函数指令区。

4.代码示例

#include <iostream>

using namespace std;

void swap(int *a, int *b); 
int *addArray(int *array, size_t size);
int *ptrParamAddArray(int *array, size_t size, int *(*p)(int *, size_t));

int main(int argc, char **argv)
{
    // 指针变量做函数形参
    int x = 1, y = 2;
    cout << "before swap: " << "(x,y) = " << x << "," << y << endl;
    swap(&x, &y);
    cout << "after swap: " << "(x,y) = " << x << "," << y << endl;
    
    // 指针变量做函数形参,返回值是指针类型的函数
    int a[2] = {2, 3};
    cout << "before add: " << "(a[0], a[1]): " << a[0] << "," << a[1] << endl;
    int *p = addArray(a, 2);
    cout << "after add: " << "(a[0], a[1]): " << p[0] << "," << p[1] << endl;

    // 定义指向函数的指针变量
    void (*fp)(int*, int*);
    fp = swap;
    cout << "before pswap: " << "(x,y) = " << x << "," << y << endl;
    fp(&x, &y);
    cout << "after pswap: " << "(x,y) = " << x << "," << y << endl;

    // 定义指向返回值是指针类型函数的指针变量
    int *(*fpa)(int *, size_t);
    fpa = addArray;
    cout << "before fpa add: " << "(a[0], a[1]): " << a[0] << "," << a[1] << endl;
    p = fpa(a, 2);
    cout << "after fpa add: " << "(a[0], a[1]): " << p[0] << "," << p[1] << endl;

    // 函数指针作为函数的形参
    cout << "before pfpa add: " << "(a[0], a[1]): " << a[0] << "," << a[1] << endl;
    p = ptrParamAddArray(a, 2, fpa);
    cout << "after pfpa add: " << "(a[0], a[1]): " << p[0] << "," << p[1] << endl;

    return 0;

}

// 指针做函数参数
void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

// 返回指针的函数
int *addArray(int *array, size_t size)
{
    for(size_t i = 0; i < size; i++)
    {
        array[i] += i;
    }
    return array;
    // // return pointer of local variable[error] 
    // int p[2] = {4, 5};
    // int *r = p;
    // return r;
}

// 函数指针做函数形参的函数
int *ptrParamAddArray(int *array, size_t size, int *(*p)(int *, size_t))
{
    int *tmp = p(array, size);
    array = tmp;
    return array;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:22:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:59:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码