Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何区分c语言中函数的输入、输出和输入输出参数?_C++_C_Function_Pointers_Parameters - Fatal编程技术网

C++ 如何区分c语言中函数的输入、输出和输入输出参数?

C++ 如何区分c语言中函数的输入、输出和输入输出参数?,c++,c,function,pointers,parameters,C++,C,Function,Pointers,Parameters,阅读一些软件模块的“软件详细说明”文档,我在每个功能的说明中看到: 输入参数: 输出参数: 输入输出参数: 例如,我们有以下几点: typedef struct { u16_t elementA; u16_t elementB; u8_t elementC; } myStruct; void somefunction(myStruct *pToMyStruct) { pToMyStruct->elementA = 1; pToMyStruct

阅读一些软件模块的“软件详细说明”文档,我在每个功能的说明中看到:

  • 输入参数:
  • 输出参数:
  • 输入输出参数:
  • 例如,我们有以下几点:

    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”是一个输入输出参数?为什么它不仅仅是一个输入参数?作为一个没有经验但理解代码的程序员,我如何在函数中轻松识别这3种类型的参数?例如,输入参数仅在其自身的函数中修改,或者


    我会感激的

    输入-您只向函数传递一个值/参数。 输出-函数将更新传递的变量的值(只有在C中有指针,C++中有指针或引用时才可能) 输入和输出-同一变量可用于传递值,也可用于 获取更新的值,变量类型与o/p相同


    在您的代码中,传递了一个结构变量,您将在调用somefunction()的函数中获得一个更新的结构。因此,它是输入和输出变量。

    C中的参数总是通过副本传递。使用指针时,它会复制指向同一对象的指针。然后,如果修改“指针副本”的内容,它将修改“真实对象”

    因此,它是一个输入/输出参数(因为可以修改它)

    如果你有

    void somefunction(myStruct theStruct)
    

    然后是结构本身将被复制;然后它将成为一个输入参数。

    这是因为正在传递一个指向结构的指针,而它不是
    const
    -qualified。这里是规则

  • 输入:函数不修改的正常参数。这可以是
    const
    指针
  • 输出:一个指向变量的指针,函数在运行时将修改该变量 返回。在调用函数之前,该变量未初始化
  • 输入-输出:上述两项的组合。您传递一个指针,该指针已经指向有效数据,当函数返回时,数据将以某种方式更改。
    swap
    函数就是一个很好的例子

  • 与其他一些语言不同,C(以及C++)实际上没有一个关键字来表示什么参数是什么,但根据经验法则:

    • 输入参数通常是指向常量的指针(或按值传递)
    • 如果可能的话,您应该避免使用纯输出参数,而是使用返回值(这就是它们的用途)
    • 所以,除非文档中另有说明,或者函数名表明了这一点,否则我假设指向non-const参数的指针表示输入输出参数

    编辑:

    我应该提到的是,第二点(以及随后的第三点)可能会引起一些争议,因为有很多API使用纯输出参数——有些是出于正当理由(例如,因为它们使用返回值表示失败或成功),有些是因为它们可以追溯到很久以前,当编译器运行时,它会变得非常愚蠢,这实际上是一个重要的性能优化。

    如描述中所述,pToMyStruct是一个指针,这意味着参数实际上是结构数据的内存地址。因此,传输的数据既可以使用,也可以修改,这就是为什么它是一个输入输出参数

    输入参数是一个无法在函数中修改的参数,就像普通变量一样

    简单的输出参数基本上是函数返回的值

    问题是函数通常需要有几个输出变量。为此,必须使用给定的指针作为参数。因此,除非您对代码有很好的理解,否则无法推断参数中的指针是输入、输出还是输入输出。要确定这一点,唯一的方法是像查看示例一样查看文档

    // INPUT-OUTPUT PARAMETER: pointer to structure (pToMyStruct)
    void somefunction(myStruct *pToMyStruct) {
       pToMyStruct->elementA  = 1;
       ...
    }
    
    “为什么它不仅仅是一个输入参数?”-从技术上讲,你是正确的:它只是一个输入参数。函数的唯一输出是其返回值及其对全局环境的影响(全局变量,
    printf()
    等)

    “软件详细描述”(作者)一直坚持“C-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
    。给定一个简单的示例函数,它是一个输出参数

    但为什么在这种情况下“pToMyStruct”是一个输入输出参数? 为什么它不仅仅是一个输入参数?我怎么能,作为一个没有经验的人 程序员但理解代码,很容易识别这3种类型的 函数中的参数?例如,输入参数仅为 在其自身功能中进行了修改

    我喜欢这个问题。也许它太宽泛了,无法用几个想法来回答,但以下是一些可以开始的想法:

    • 想法1-函数/方法无法修改的形式参数,只能输入函数或方法
    因此,“const T formalParam”显然是一个输入。。。如果函数试图修改const T formalParam,则const命令编译器声明错误

    void* memcpy( void* dest, const void* src, size_t count );
    // wrt memcpy: ^^output   ^^^^^input       ^input:pass-by-value
    // Note direction:   to <---move <---from
    // I think this right-to-left idea might be a trend in C (research?)
    // return would seem useless, but is sometimes convenient value: copy of dest
    
    
    int memcmp ( const void* lhs, const void* rhs, size_t count );
    //           ^^^^^input       ^^^^^input       ^input:pass-by-value
    // return is result of comparison negative: int, 0, positive int
    
    
    int isalpha( int ch );
    //           ^input:pass-by-value
    // return is 0 (false) or non-zero (true)
    
    
    
    //from std::string::find
    
    size_type find( const basic_string& str, size_type pos = 0 ) const;
    //              ^^^^^ input              ^input: pass-by-value
    // return is npos or index where str found
    
    T  foo ( <input parameters> , <output parameters> );