全局变量向函数传值

本文详细探讨了在编程中如何使用函数参数与全局变量来传递数据。解释了函数的创建格式,包括带与不带返回值的情况,并讨论了在函数调用时形参的作用。进一步分析了使用全局变量作为函数参数的优缺点,特别是在参数数量受限时的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般情况

子函数的创建格式一般是如下形式:
1.带返回值

typeName functionName(typeName1 x1,typeName2 x2,...,typeName xn);
or
typeName functionName(void);

2.不带返回值

void functionName(typeName1 x1,typeName2 x2,...,typeName xn);
or
void functionName(void);

在声明函数时通常可以省略形参名称:例如:

typeName functionName(typeName1 ,typeName2 ,...,typeName );
int add(int,int);//调用时只看形参的类型和数目。

调用函数时,若需要向子函数传递形参,则一般需要在定义时带上形参的名称,以便值传递;

void swap(int a,int b);
{	
	 int temp=0;
	 temp=a;
	 a=b;
	 b=temp;
}

采用全局变量作为函数参数有什么好处呢?
采用全局变量作为参数有时具有意想不到好处:

#include<iostream>
using namespace std;
int a=3,b=5;
int add(int a,int b)
{
	return a+b;
}
int main()
{
	int c;
	c=add(a,b);
	cout<<c<<endl;
	system("pause");
	return 0;
}

显然这时候定义的形参有点多余。因为a,b是全局变量,其作用范围是从其定义位置起,到程序结束,之间都是有效的。所以,在add()中,不用形参传递就可以使用a,b且有效;所以上边可以修改为:

#include<iostream>
using namespace std;
int a = 3, b = 5;
int add()
{
	return a + b;
}
int main()
{
	int c;
	c = add();
	cout << c << endl;
	system("pause");
	return 0;
}

说了这么多有什么用呢?
呵呵,还真有点用处,有时候在引用其他函数时,其形式是确定的,所以一次传进的参数的个数是有限的。但是,此时你想传递函数的参数个数大于所给形参个数,哪该怎么办?我们可以将其余的参数定义成全局变量,此时就可以将参数传递进去了.

实例

例如在同时调用函数:

CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

回调函数的格式是固定的,若此时回调函数需要传递两个int型参数,则是无法进行的。
回调函数格式:

void Foo(int,void\*);

自定义的回调函数:

static void on_ContrastAndBright(int, void*)
{
	namedWindow("【原始窗口】", 1);
	for (int y = 0; y < g_scrImage.rows; y++)
	{
		for (int x = 0; x < g_scrImage.cols; x++)
		{
			for (int c = 0; c < 3; c++)
			{
				g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
					((g_nContrastValue*0.01)*(g_scrImage.at<Vec3b>)
						(y, x)[c]) + g_nBrightValue;
			}
		}
	}
	imshow("【原始图窗口】", g_scrImage);
	imshow("【效果图窗口】", g_dstImage);
}

其中:

/*
g_scrImage、g_dstImage、g_nContrastValue、g_nBrightValue均需要传递进来,但是由于函数定义类型的限制,不能通过形参传递,所以采用全局变量传递。
*/

总结

向子函数传值不经可以通过形参(局部变量),当然还可以通过全局变量;
当然还可以通过指针等方式进行传递等等。

水平有限,若有误请指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值