結構體變量作爲函數的參數和返回值

結構體變量作爲函數的參數和返回值
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章