인공지능 개발일지

[C언어] 구조체 본문

개발 지식/C,C++

[C언어] 구조체

Prcnsi 2021. 6. 15. 16:11
728x90

안녕하세요! 벌써 올해의 반이 갔습니다.

시간 정말 빠르지 않나요?

대학교 입학한게 엊그제 같은데 벌써 1학기가 끝났다니

신기할 다름입니다. 

본론으로 돌아와서 오늘은 구조체에 대해 알아봅시다!

 

 


 

 

 

 

 

1.구조체 개념

 

여러분은 C언어 자료형을 배울 때 어떤 느낌이셨나요?

(추후에 자료형에 대한 포스팅도 올리겠습니다)

 

여지껏 배웠던 자료형과 자료형 별 배열은 전부 같은 종류의 자료형

다루는 법을 배웠는데요. 저는 이 자료형을 배우면서 파이썬의 리스트처럼 다른 자료형을 

담을 수 있는 것은 없을까 의문이 들었습니다.

그런데 역시나 이미 존재했습니다. 그것이 바로 구조체입니다.

구조체는 서로 다른 자료형을 묶어주는 역할을 합니다.

예를 들어 전화번호부 같이 이름과 번호를 묶는 것이지요.

 

 

2.구조체 사용 법

 

  구조체는 함수를 선언하듯이 해당 구조체를 사용하는 함수보다 앞에서

  구조체를 선언하고 구조체 변수를 선언하여 사용합니다.

struct 구조체명{
    변수 선언//구조체의 멤버
};

반환타입 함수명{
    struct 구조체명 변수명
    변수명.멤버명=값;
}

  일반적으로 구조체를 사용하는 구조는 위와 같습니다.

 

  이때 주의할 점은 아래와 같다.

 

  • 구조체를 선언하고 마지막에 세미콜론을 찍어주어야 한다는 것
  • 구조체 변수를 선언하고는 (struct 구조체명)은 생략하고 변수명에 마침표로 구조체의 멤버에 접근
  •  struct 안에 여러 변수들은 구조체의 멤버
  • 구조체 멤버에 값을 하나하나 할당할 때 멤버가 문자열이면 strcpy로 값을 할당

 

  이때 하나하나라는 표현을 쓴 이유는 값을 할당하는 방법에는 2가지가 있기 때문이다.

  하나는 중괄호를 이용하여 한 번에 할당 나머지는 하나하나 할당하는 방법이 있다.

 

  1)한 번에 할당

     한 번에 할당하는 법은 아래와 같다.

     중괄호를 사용하여 값을 할당하면 한 멤버라도 빠뜨리면 안 된다.

struct 구조체명 변수명={.멤버1=값,.멤버2=값,.멤버3=값 · · · ·};

 

     아래는 그 예제이다.

 

한 번에 할당

  2) 하나하나 할당

     하나하나 할당하는 방법은 위의 주의사항에서 언급했듯이 문자열을 strcpy로 할당해야 한다는 것외에는

     특별할 것이 없다. 중괄호를 쓰지 않고 아래와 같이 할당해주면 된다.

  문자열외:  구조체변수.멤버=값
  문자열:     strcpy(구조체변수.멤버,값);

     굳이 차이점을 꼽는다면 한 번에 할당할 때는 구조체 변수명을 생략한다는 점이 있다.

 

 

 

     아래는 하나하나 할당하고 출력하는 예제이다.

하나하나

 

3.구조체 배열

   구조체 배열은 말 그대로 구조체를 복사 불여넣기 한 것이다.

   그러니까 붕어빵 틀 같이 선언한 구조체(틀)로 여러 구조체를 찍어낼 수 있다는 말이다.

   무엇으로? 구조체 변수로 !

 

   방법은 아래와 같다

struct 구조체명 변수명[배열의 크기]

   이 또한 한 구조체로 여러 구조체를 만들 때 구조체 배열을 만들지 않고 아래와 같이

   선언할 수도 있다.

   

   그리고 이 각각의 구조체 변수에는 다른 값이 할당할 수 있는 것이다.

   struct student s1
   struct student s2
   struct student s3
   struct student s4
   struct student s5
   struct student s6
   struct student s7
   struct student s8
   struct student s9

 

  이것이 기본적인 구조체를 여러 개 만든다는 것인데

  이 구조체를 배열로 아래와 같이 만들 수 있다.

 

  구조체 자체를 배열로 만들면 아래와 같다.

   struct student s[9]

 

  차이는 구조체 배열은 여러 구조체를 묶어놓아 더 관리하기 쉽다는 점이 있다.

  쉽게 이해가지 않는가?

  예제로 먼저 구조체를 선언한다.

 

struct exam{
    int a;
    float b;
    char c[5];
};

 

구조체 배열 자료형
구조체 

  그리고 메인 함수에서 구조체 배열을 생성한다.

 

int main(){
    struct exam s[3]
}

  위 코드는 정확히 아래와 같이 메모리 주소를 확보해 놓는 역할을 한다.

구조체 배열 

 

 

 

 

 

4.포인터에서 구조체 멤버 접근

  이게 무슨 말이냐면 일반 구조체에서는 멤버에 접근할 때 마침표를 썼다.

  그런데 구조체 포인터를 선언했을 경우는 마침표로 접근하지 않는다.

 

  이경우 구조체 포인터에서 멤버에 접근할 때 마침표가 아닌 화살표로 멤버에 접근하고 값을 할당한다.

  (참고로 포인터 구조체에 화살표로 접근해서 값을 할당할 때는 역참조 연산자를 쓰지 않아도 된다)

  정리하면 아래와 같다.

멤버 접근 방법 기호
기본 구조체 .
구조체 변수를 포인터로 선언 ->

 

 

 

 


 

 

 

 

이상으로 구조체 포스팅을 마치겠습니다.

오늘도 방문해주셔서 감사합니다:)

728x90

'개발 지식 > C,C++' 카테고리의 다른 글

[C++] 벡터, 스택, 큐 사용법과 차이  (0) 2023.05.02
[C언어] 포인터 사용 법  (0) 2021.06.18
[C언어] 배열의 A-Z까지,  (0) 2021.06.13
[C언어] 헤더파일과 전처리기  (2) 2021.06.10
[C언어] 파일 입출력  (0) 2021.06.02