본문 바로가기

C 언어/임베디드 C

구조체를 함수의 인수로 전달하는 방법

구조체는 함수의 인수나 함수의 반환값으로 사용될 수 있다. 구조체를 함수의 인수로 전달할 때는 구조체 자체를 전달하는 방법과 구조체의 주소를 전달하는 방법이 있다.

(1)구조체의 멤버를 함수의 인수로 전달하는 경우
//두 점사이의 거리를 구하는 프로그램

#include <stdio.h>
#include <math.h>

typedef struct
{
  int x, y;
}POINTER;    //구조체의 정의
double distance (intintintint);  //함수의 선언

int main()
{
  POINTER p1, p2;        //두 점을 위한 변수의 선언
  double dist;        //두 점 사이의 거리를 위한 변수의 선언

  printf("please enter x & y coordinate : ");
  scanf("%d %d"&p1.x, &p1.y);
  printf("please enter x' & y' coordinate : ");
  scanf("%d %d"&p2.x, &p2.y);

  //구조체의 멤버를 인수로 사용
  dist = distance(p1.x, p1.y, p2.x, p2.y);
  printf("distance : %6.3f\n", dist);

  return 0;
}

double distance(int a, int b, int c, int d)
{
  int square1, square2;

  square1 = (c-a) * (c-a);
  square2 = (d-b) * (d-b);
  return (sqrt (square1 + square2));
}


(2) 구조체 변수를 함수의 인수로 전달하는 경우
//구조체를 인수로 전달하는 방법

#include <stdio.h>
#include <math.h>

typedef struct{
  int x, y;
}POINTER;

double distance (POINTER p1, POINTER p2);

int main()
{
  POINTER p1, p2;
  double dist;
  printf("please enter x & y coordinate : ");
  scanf("%d %d"&p1.x, &p1.y);
  printf("please enter x' & y' coordinate : ");
  scanf("%d %d"&p2.x, &p2.y);

  dist = distance (p1, p2);    //구조체 변수를 인수로 전달
  printf("distance : %6.3f\n", dist);

  return 0;
}

double distance (POINTER p1, POINTER p2)
{
  int square1, square2;

  square1 = (p2.x - p1.x) * (p2.x - p1.x);
  square2 = (p2.y - p1.y) * (p2.y - p1.y);
  return (sqrt (square1 + square2));
}



(3) 구조체의 주소를 인수로 전달하는 방법
//구조체의 주소를 인수로 전달하는 방법

#include <stdio.h>
#include <math.h>

typedef struct{
  int x, y;
}POINTER;

double distance (POINTER *p1, POINTER *p2);

int main()
{
  POINTER p1, p2;
  
  printf("please enter x & y coordinate : ");
  scanf("%d %d"&p1.x, &p1.y);
  printf("please enter x' & y' coordinate : ");
  scanf("%d %d"&p2.x, &p2.y);

  //구조체의 주소를 인수로 전달
  printf("distance : %6.3f\n", distance(&p1, &p2));

  return 0;
}

double distance (POINTER *p1, POINTER *p2)
{
  int square1, square2;

  square1 = (p2->x - p1->x) * (p2->x - p1->x);
  square2 = (p2->y - p1->y) * (p2->y - p1->y);
  return (sqrt (square1 + square2));
}


결과는 모두 같다.
하지만 (1)과 (2)를 비교하면
(1)dist = distance(p1.x, p1.y, p2.x, p2.y);
(2)dist = distance (p1, p2);
보는 것처럼 함수 인자 개수가 줄어든다.

(2)와 (3)을 비교하면
(2)double distance (POINTER p1, POINTER p2);
(3)double distance (POINTER *p1, POINTER *p2);
(2)는 구조체내에 int x, y가 있어서 POINTER가 각각 8바이트이지만, (3)은 포인터를 인자로 하기에 각각 4바이트이다.

결과적으로 (3)의 방법이 가장 효율적이다.



'C 언어 > 임베디드 C' 카테고리의 다른 글

열거형  (0) 2011.08.17
연결리스트  (0) 2011.07.08
구조체를 가리키는 포인트변수  (0) 2011.07.07
구조체의 배열  (0) 2011.07.07
구조체의 초기화  (0) 2011.07.07