阅读一些软件模块的《软件详细说明》文档,在各个功能的说明中看到:
- 输入参数:......
- 输出参数:......
- 输入-输出参数:......
例如,我们有以下内容:
typedef struct
{
u16_t elementA;
u16_t elementB;
u8_t elementC;
} myStruct;
void somefunction(myStruct *pToMyStruct)
{
pToMyStruct->elementA = 1;
pToMyStruct->elementB = 5;
pToMyStruct->elementC = 7;
}
在软件描述文档中,描述如下:
- 输入参数:无
- 输出参数:无
- 输入-输出参数:指向结构 (pToMyStruct) 的指针
我对 c 编程技术不是很了解,但为什么在这种情况下“pToMyStruct”是一个输入输出参数?为什么它不仅是一个 INPUT 参数?作为一个没有经验但理解代码的程序员,我如何轻松识别函数中的这三种类型的参数?例如 INPUT 参数只能在它自己的函数中修改,或者?
将不胜感激!
最佳答案
// INPUT-OUTPUT PARAMETER: pointer to structure (pToMyStruct)
void somefunction(myStruct *pToMyStruct) {
pToMyStruct->elementA = 1;
...
}
“为什么它不仅仅是一个INPUT参数?” - 从技术上讲你是对的:它只是一个输入参数。函数的唯一输出是它的返回值及其对全局环境的影响(全局变量、printf()
等)
“软件详细说明”(作者)被“C-does-not-have-pass-by-reference”卡住了,所以想创造一个新的“观点”。如:让我们将输入指针参数称为伪传递引用,即:输入、输出或 IO。作者希望您记录该模型。
// the return value is an output
int foo()
// x is an input parameter
void foo(int x)
// what x points to is an input parameter, be it an `int` or array of `int` or NULL
void foo(const int *x)
// what x points to is an output parameter
void foo(int *x) {
// *x not read before being set
// what x points to is an I/O parameter
void foo(int *x) {
// *x read before being set
所以 myStruct *pToMyStruct
要么是输出参数,要么是 IO 参数。如果不深入研究函数体,将其归类为 IO 更安全,因为函数签名允许读取和写入 *pToMyStruct
。给定简单的示例函数,它是一个输出参数。
关于c++ - 如何区分c中函数的INPUT、OUTPUT和INPUT-OUTPUT参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416070/