fopen_s和strtok_s函数中FILE**类型参数详解

前言

fopen_s 是 C11 标准中引入的安全版本的文件打开函数,用于替代不安全的 fopen 函数。

strtok_s 是 C11 标准中引入的安全版本的字符串分割函数,用于替代不安全的 strtok 函数。

我在初识这两个函数时,在使用时总是传错参数,故细细研究,出此博文,望对大家有所帮助。

函数原型

errno_t fopen_s(
    FILE** pFile,           // 指向文件指针的指针
    const char* filename,   // 文件名
    const char* mode        // 打开模式
);
char* strtok_s(
    char* str,              // 要分割的字符串(第一次调用传入,后续传入NULL)
    const char* delimiters, // 分隔符字符串
    char** context          // 上下文指针,用于保存分割状态
);

为什么他们有一个参数传的是FILE**类型的参数呢?

我们可以看一下该参数的作用是什么:

1、在fopen_s中pFile在成功后会被赋值为打开函数的指针(我将它理解为”代理指针“)。

2、在strtok_s中context是用来保存上下文指针的。

我们在接下来的使用中,肯定是要调用FILE*形式的指针,那我们为什么要传一个二级指针呢???

不难看出,这两个FILE**类型的二级指针所指向的一级指针都是需要改变的,所以我们传参的时候他们穿的是他们的地址的地址而不是它们的值。

何意味?

传址调用和传值调用是截然不同的两种调用方式。

从函数堆栈的角度来看

传参调用的本质是将实参的值复制一份堆在主函数的内存之上作为函数的形参,在函数中调用参数时调用的实际上是实参的复制品,故我们无法通过在函数中改变参数来对中函数中的实参产生影响。

但是传址调用就不一样了,它实际上是在函数中声明了指向实参的地址,我们可以认为形参就是实参,只不过在使用的时候是通过传的地址来调用实参罢了。

所以我们就可以直接通过形参这个地址直接访问实参,修改也不受限制。

综上所述

因为函数要改变指针的值,所以我们要传地址的地址,也就是FILE**类型的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值