C언어 구조체의 이해
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

C언어 구조체의 이해에 대한 보고서 자료입니다.

목차

(1) 구조체 선언

(2) 구조체 변수의 선언, 초기화 및 구조체 포인터

(3) 구조체의 사용

(4) 구조체의 중첩

본문내용

다.
? 함수에 구조형 멤버의 주소 전달
func(&mike.x); // 문자형 x의 주소전달
func2(&mike.y); // 정수형 y의 주소전달
func3(&mike.z); // 부동 소수점형 z의 주소전달
func4(mike.s); // 문자열 s의 주소전달
func(&mike.s[2]); // 문자형 s[2]의 주소전달
여기에서 주소연산자 &는 멤버의 앞이 아니라 구조형의 이름에 붙는다. 이것은 배열명과는 달리 구조형 명 자체는 구조형의 주소를 나타내는 것이 아니기 때문에 구조형의 주소를 얻기 위해서는 주소연산자가 필요하다. 또 문자열 s는 이미 주소를 의미하고 있으므로 &를 붙이지 않는다.
#2----- 함수에 구조형 전체를 전달
구조형을 함수에 대한 매개변수로 사용하는 경우 값호출(call by value)기법을 사용하여 구조형 전체를 전달할 수 있다. 이것은 구조형의 내용변경은 함수내에서만 이루어지고 호출환경에 있는 구조형에는 영향을 주지 않음을 의미한다.
이러한 경우 주의해야 할 것은 실매개변수와 형식매개변수의 형이 일치되어야 한다는 점이다.
함수에 구조형 전체를 전달
main()
{
struct {
int a,b;
char ch;
} arg;
arg.a = 1000;
f1(arg);
}
f1(parm)
struct {
int x,y;
char ch;
} parm;
{
printf("%d",parm.x);
}
이 예에서 프로그램은 실매개 변수(arg)와 형식 매개 변수(parm)를 같은 구조형으로 선언하고 있다. 그리고 이 프로그램의 실행결과는 화면에 1000을 출력할 것이다.이런 식의 작성방법은 프로그래밍 노력을 줄일뿐만 아니라, 더욱 중요한 것은 실매개 변수와 형식 매개 변수가 실제로 일치되도록 보장하는데 도움을 준다.
#3----- 포인터 기반 함수와 구조형 기반 함수.
함수와 함께 구조형을 설명하기 위하여 카드놀이를 위한 구조를 card.h라는 화일에 다음과 같이 정의하였다고 하자.
typedef struct {
int pips; // 카드점수: 1(Ace)부터 13(King)까지
char suit; /* 카드패: clubs(c),diamonds(d),hearts(h),spad
es(s) */
} card;
(1) 포인터 기반 함수
구조형에 대해 수행할 수 있는 연산이 주소연산자(&)를 사용하여 구조형의 주소를 찾아 그 멤버중의 하나를 참조해야 하는 방식(즉, 구조형이 하나의 단위로서 복사될 수 없고 값을 배정할 수도 없으며, 함수로 전달될 수 없고 반환될 수 없는)의 시스템에 대해서는 구조형에 대한 포인터를 사용해야 구조형과 함수를 함께 사용할 수 있다.
예를 들어. card에 값을 할당하고 카드멤버 값을 발췌한 후 카드의값을 출력하는 함수를 포인터에 기반을 둔 매개변수로 작성하면 다음과 같다.
포인터 기반 함수(구조형 전달)
#include "card.h"
assign_values(c_ptr,p,s)
card *c_ptr;
int p;
char s;
{
c_ptr -> pips=p; /* 하트패에 값이 제대로 배정되었는지를
출력해보는 문장 */
c_ptr -> suit=s;
}
extract_values(c_ptr,p_ptr,s_ptr)
card *c_ptr;
int *p_ptr;
char *s_ptr;
{
*p_ptr=c_ptr -> pips;
*s_ptr=c_ptr -> suit;
}
prn_values(c_ptr)
card *c_ptr;
{
int p;
char s,*name;
extract_values(c_ptr,&p,&s);
name=(s=='c')?"clubs":(s=='d'
)?"diamonds":
(s=='h')?"hearts":(s=='s')?"spades":"error";
printf("\n card:%d of %s",p,name);
}
위 예제에서 쓰인 함수들은 구조형 card의 변수에 대한 포인터를 사용하여 구조형을 참조하고 있다. 여기에서 ?부분의 c_ptr -> pips;은 (* c_ptr).pips와 같음을 알 수 있다. 이 예제의 경우와 같이 구조형에 대한 포인터가 자주 사용되면 ->기호표기로 멤버를 접근하는 것이 더 편리하다. 한편, 구조형 card에 대한 포인터를 취하고 함수 extract_values()를 이용하여 그 값을 출력하는 함수가 prn_values()이다.
(2) 구조형 기반 함수
(1)항에서 언급한 구조형에 대한 제약을 가지지 않는 시스템에서는 구조형은 매개변수로 전달될 수 있을 뿐만 아니라 값으로 반환되거나 수식에 배정될 수 있다. 따라서 만일 변수a와 변수b가 같은 구조형의 자료형을 가지면 a=b라는 배정이 성립된다. 이것은 b의 각 멤버를 a에 배정하는 것과 같은 의미이다.
구조형이 함수에 대한 매개변수일 경우 값에 의해(by value) 전달된다. 즉, 구조형의 지역복사가 만들어져 모든 변화와 접근은 지역복사에 대해서 수행한다. 따라서 이러한 함수를 벗어나면 호출환경의 구조형은 변경이 없게 된다.이것은 매개변수를 구조형의 멤버로 만들어야 값 호출방식으로 전달됨을 의미한다.
(1)항의 card에 대한 포인터 사용과는 달리 다음 함수는 구조형 card를 전달하고 반환한다.
구조형 기반 함수(구조형 전달)
#include "card.h"
card assign_values(p,s) // 구조체 테이타타입을 return value값으로 가짐
int p;
char s;
{
card c;
c.pips = p;
c.suit = s;
return (c);
}
extract_values(c,p_ptr,s_ptr)
// 카드에 들어있는 무늬와 숫자를 빼내는 부분
card c;
int *p_ptr;
char *s_ptr;
{
*s_ptr = c.suit;
*p_ptr = c.pips;
}
여기에서 함수 assign_values()는 구조형 card의 지역변수c를 사용하고 있는데 이것은 명시적으로 반환되며 구조형 card의 변수에 배정될 수 있다. 또 함수 extract_values()는... 값에 의해(by value) 구조형 card c를 전달한다.
  • 가격1,300
  • 페이지수10페이지
  • 등록일2006.07.18
  • 저작시기2000.11
  • 파일형식한글(hwp)
  • 자료번호#359199
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니