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;
}
在软件描述文档中,描述了以下内容:
我会感激的 输入-您只向函数传递一个值/参数。 输出-函数将更新传递的变量的值(只有在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-函数/方法无法修改的形式参数,只能输入函数或方法
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> );