c++ - 如何区分c中函数的INPUT、OUTPUT和INPUT-OUTPUT参数?

标签 c++ c function pointers parameters

阅读一些软件模块的《软件详细说明》文档,在各个功能的说明中看到:

  1. 输入参数:......
  2. 输出参数:......
  3. 输入-输出参数:......

例如,我们有以下内容:

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;
}

在软件描述文档中,描述如下:

  1. 输入参数:无
  2. 输出参数:无
  3. 输入-输出参数:指向结构 (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/

相关文章:

c++ - 尝试在C++中打印树的内容时出现内存分配错误

c - PsLookupProcessByProcessId 与 DWORD pid?参数1需要HANDLE?

c++ - OpenCV 2.3.1。 cv::Mat 到 std::vector 转换

c++ - 将新值写入数组

c++ - 处理内存分配时的保护标志

c - 二维字符数组,像表格一样扫描和打印

javascript - 函数范围与 Javascript 对象中的代码顺序

javascript - 为什么 JavaScript 函数别名不起作用?

python - 传递参数而不是全局变量

c++ - WinSock c++ inet_ntop 总是显示 204.204.204.204(并且 accept() 没有失败)