前言
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**类型的参数。
791

被折叠的 条评论
为什么被折叠?



