C++ 形参与实参的传递

本文探讨了函数调用中形参与实参的概念,并通过具体示例解析了如何正确使用指针来实现参数的有效传递。此外,还分析了函数修改过程中需要注意的几个关键点。

函数调用形参、实参的问题

函数调用时,参数分两种 一种是送进去的参数,一种是想从里面得到的参数。比如:

ExternalRectangle((unsigned char*)(frame->imageData), ObjInfo,widthstep,alarm_flag,&ROI_left,&ROI_right,&ROI_top,&ROI_bottom);

对于这个函数来说:我们需要送进去的参数是rame->imageData ObjInfo,widthstep,

从里面得到的参数是:alarm_flag,&ROI_left,&ROI_right,&ROI_top,&ROI_bottom

一个函数的改动需要动三个地方:

头文件+调用的部分+程序实现的部分

头文件:

//void ExternalRectangle(unsigned char* pRGBIn, MS_ObjectInfo *ObjInfo, int ObjCount, int widthStep);
void ExternalRectangle(unsigned char* pRGBIn, MS_ObjectInfo *ObjInfo, int ObjCount, int widthStep,bool &alarm_flag1,int *alarm_left,int *alarm_right,int *alarm_top,int *alarm_bottom);

函数实现部分:

void ExternalRectangle(unsigned char* pRGBIn, MS_ObjectInfo *ObjInfo, int i1, int widthStep,bool &alarm_flag1,int *alarm_left,int *alarm_right,int *alarm_top,int *alarm_bottom)

2.

*alarm_left= ObjInfo[i1].TarBox.left;

*alarm_right=ObjInfo[i1].TarBox.right;

*alarm_top=ObjInfo[i1].TarBox.top;

 *alarm_bottom=ObjInfo[i1].TarBox.bottom;

alarm_left= &ObjInfo[i1].TarBox.left;

alarm_right=&ObjInfo[i1].TarBox.right;

alarm_top=&ObjInfo[i1].TarBox.top;

 alarm_bottom=&ObjInfo[i1].TarBox.bottom;

的区别:

前者可以实现形参与实参的传递。

下面只能在函数的实现里面,打印出来的数据是对的,不能传递到外部。

3. alarm_flag 被覆盖掉。

    改了函数的结构:

4. 现在的问题是:每次检测ROI 区域之后,框自动缩小。




<think>好的,我需要解释C++中的形参实参的关系以及它们的作用域。首先,我得回忆一下这两个概念的定义。形参是函数定义中声明的参数,而实参是调用函数时传入的具体值或表达式。作用域方面,形参的作用域仅限于函数体内,而实参的作用域取决于它们被定义的位置。 接下来,我需要用简单的中文解释清楚两者的区别和联系。可能需要举例子,比如一个简单的函数,比如void foo(int a),这里的a是形参,调用时foo(5)中的5是实参。然后说明在函数内部,a只能在函数内部使用,而实参5作为常量,其作用域可能更广泛,但在这个调用中只是传递值给a。 关于作用域,形参的作用域是函数体内部,而实参的作用域要看它们原本在哪里定义。比如,如果实参是一个变量,那么它的作用域是其定义的位置,可能在全局或某个块内。这里需要强调形参实参是独立的,函数内对形参的修改不会影响实参(除非传递的是指针或引用)。 然后,用户可能需要知道按值传递和按引用传递的区别。这时候应该提到,按值传递时,形参实参的副本,修改不影响原值;而按引用传递时,形参实参的别名,修改会影响原值。这部分可能需要结合例子说明。 还需要注意用户提供的引用内容,比如引用[1]中的allocSize和someList的例子,可能涉及模板参数的作用域。虽然用户的问题是关于形参实参,但可能需要解释模板参数的作用域是否类似。比如,模板参数的作用域仅限于模板定义内部,和形参类似。 另外,引用[2]中提到的方法可以定义为任何命名类型,可能和函数参数的作用域无关,但需要确认是否有相关点需要提及。比如,函数作为方法时,接收者的作用域是否与形参有关联。 最后,生成相关问题时要考虑用户可能进一步想知道的内容,比如参数传递方式的影响,作用域的生命周期,或者在不同作用域中变量同名的情况如何处理等。需要确保问题覆盖这些方面,帮助用户深入理解。</think>### C++形参实参的关系及作用域解析 #### 1. **形参实参的定义** - **形参(Formal Parameters)**:函数声明或定义时声明的参数,用于接收调用时传入的值。 ```cpp void printSum(int a, int b) { // a, b 是形参 cout << a + b; } ``` - **实参(Actual Parameters)**:调用函数时传递的具体值或表达式。 ```cpp printSum(3, 5); // 3, 5 是实参 ``` #### 2. **作用域规则** - **形参的作用域**:仅在函数体内有效,函数结束后销毁。 ```cpp void func(int x) { // x 的作用域始于函数入口,终于函数出口 x = 10; // 合法操作 } ``` - **实参的作用域**:由实参自身的定义位置决定。若实参是局部变量,其作用域与原始定义一致。 ```cpp int main() { int m = 5; func(m); // m 的作用域在 main 函数内,与 func 的形参 x 无关 } ``` #### 3. **参数传递方式的影响** - **按值传递**:形参实参的副本,修改形参不影响实参。 ```cpp void modify(int y) { y = 20; // 不影响调用处的实参 } ``` - **按引用传递**:形参实参的别名,修改形参直接影响实参。 ```cpp void modifyRef(int &y) { y = 20; // 直接修改原变量 } ``` #### 4. **模板参数的作用域(引用[1]示例解析)** 在模板中,形参(如 `allocSize`)的作用域仅限于模板定义内部: ```cpp const size_t allocSize = sizeof(eastl::list<int>::node_type); eastl::list<int, NodePool<allocSize, 100>> someList; // allocSize 是模板形参实参[^1] ``` 此处 `allocSize` 作为模板实参传递,其作用域取决于它在代码中的定义位置。 #### 5. **函数与方法的扩展性(引用[2]关联)** 类似于Go语言中方法的灵活性,C++中函数的形参可以是任意类型(包括自定义类或模板类),但形参的作用域仍遵循函数作用域规则[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值