结构体变量作为函数的参数和返回值
2010-07-28 13:14
准备学习一下OpenCV,可是第一个知识点的语法就没有看懂: typedef struct CvPoint
{
int x; /* X坐标, 通常以0为基点 */
int y; /* y坐标, 通常以0为基点 */
}
CvPoint;
/* 构造函数 */
inline CvPoint cvPoint( int x, int y );
注意CvPoint结构体是大写的C,而cvPoint()构造函数则是小写的c,若是相同,则编译通不过。
于是就搜索了一下,才知道,原来结构体可以作为函数的参数,也可以作为函数的返回值。
以前一直使用结构体指针,不知道直接使用结构体变量和使用结构体指针变量有什么区别?
不过在OpenCV中,很多函数都是直接使用结构体变量的,也许这样操作速度更快??
谷歌了很久,找到一个为什么这么用的答案:
这么用属于函数的传值调用,函数中使用的是结构体的副本,函数中的操作不会改变原结构体的值,但是会牺牲一些速度。
用指针传递结构体变量的话,属于传址调用,是直接操作结构体,所以函数中的操作直接反应到结构体上。OpenCV中这么做,一是结构体比较小,影响内存开销比较小;二是防止改变结构体本身吧。一点浅见。
下面是C/C++的例子。编译测试正常。
/****************************************
结构体变量可以直接作为函数的参数,
也可以作为函数的返回值。
*****************************************/
//Filename: Struct.c
#include<stdio.h>
//定义一个结构体
typedef struct Point
{
int x;
int y;
}Point;
//使用一个结构体变量作为函数的参数
void Display(Point point)
{
printf("x is %d\n",point.x);
printf("y is %d\n",point.y);
/*********若使用C++,则如下*************
std::cout<<"x is "<<point.x<<std::endl;
std::cout<<"y is "<<point.y<<std::endl;
**************************************/
}
//使用结构体变量作为函数的返回值
Point SetPoint(int x,int y)
{
Point point;
point.x=x;
point.y=y;
return point;
}
//主函数
int main(int atgc,char * argv[])
{
Point point;
point=SetPoint(2,3);
Display(point);
return 0;
}
运行结果 x is 2 y is 3 |