C 언어 - 구조체 포인터

컴퓨터/C

728x90
반응형

구조체 포인터

사용자 정의 자료형인 구조체도 포인터 변수를 통해 제어를 할 수 있습니다. 구조체 포인터를 사용하면 다른 포인터 변수들처럼 다른 지역에서 해당 지역에 있는 변수를 제어를 가능하게 합니다.

기본 자료형 포인터의 경우 저장된 메모리 주소 부터 자료형의 크기까지의 메모리 공간을 제어할 수 있습니다.

하지만 구조체의 경우 사용자 정의 자료형이며, 여러가지 자료형이 묶여서 만들어진 형태입니다. 

포인터를 사용하여 구조체 안의 묶여있는 각각의 자료형에 접근을 할수 있는 문법적 약속이 필요합니다.

 

구조체 포인터의 선언 

구조체 포인터의 선언은 기본 자료형 포인터와 동일합니다.

typedef struct Job
{
    char name[10];
    int att;
    int HP;
}JOB;
int main()
{
    JOB job[3];
    JOB* pjob;
    return 0;
}

typedef에 관련된 내용은 아래 링크 참조하세요

 

C 언어 - typedef 키워드

typedef 키워드 - 타입을 재 정의하다. 이제 C언어에서 사용하는 모든 자료형을 다 배웠습니다. 이 자료형에 부여된 이름은 C언어 안에서 메모리 공간을 어떤 방식으로 얼마큼 할당할 거냐에 대한

blog-of-gon.tistory.com

포인터 선언을 마쳤으면 구조체 포인터를 통해 접근하기 위해 job[3]배열에 정보를 입력하고 pjob에 메모리 주소를 넣어 줍시다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

typedef struct Job
{
    char name[10];
    int att;
    int HP;
}JOB;

int main()
{
    JOB job[3];
    JOB* pjob;
    pjob = &job

    strcpy(job[0].name, "전사");
    job[0].att = 10;
    job[0].HP = 200;

    strcpy(job[1].name, "도적");
    job[1].att = 20;
    job[1].HP = 100;

    strcpy(job[2].name, "궁수");
    job[2].att = 15;
    job[2].HP = 150;
}

 

구조체 포인터를 이용한 구조체 내의 멤버변수 접근방법

구조체 포인터를 이용하여 멤버변수에 접근하기 위해서는 2가지 방법이 있습니다.

(*pjob).name
pjob->name
  • (*pjob). name 
    • 일반자료형에서 포인터안에 저장된 메모리 주소의 접근법과 동일한 방법
      • pjob.name은 일반구조체 변수의 멤버 변수에 접근하는 방법
      • 포인터 안의 값을 찾아가야 되기 때문에 *로 표시 
      • *와. 의 연산 우선순위의 차이가 있어 괄호( )를 이용해 (*pjob). name으로 표시
        • 포인터 pjob에 저장된 메모리 주소에서 .name에 접근한다 
  • pjob-> name
    • 구조체를 위한 포인터 방법으로 화살표연산자를 이용한 멤버 변수 접근
      • 실제 사용하기 편리하여 주로 사용한다.

접근해봅시다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

typedef struct Job
{
    char name[10];
    int att;
    int HP;
}JOB;

int main()
{
    JOB job[3];
    JOB* pjob;
    pjob = &job

    strcpy(job[0].name, "전사");
    job[0].att = 10;
    job[0].HP = 200;

    strcpy(job[1].name, "도적");
    job[1].att = 20;
    job[1].HP = 100;

    strcpy(job[2].name, "궁수");
    job[2].att = 15;
    job[2].HP = 150;
    
    printf("%s\n", pjob->name);
    printf("%s\n", (pjob+1)->name);
    printf("%s\n", (pjob+2)->name);
}
  • 포인터 구조체 변수또한 주소를 담고 있는 공간으로 주소 연산이 가능합니다.
  • 이제 포인터를 사용하여 main함수에 있는 지역변수인 구조체변수를 외부 함수에서 조작할 수 있게 됐습니다. 
  • 한번 응용해 보도록 하겠습니다.

응용해봅시다 ( 외부함수를 통한 main함수 안의 구조체 변수 컨트롤하기)

위의 예제를 응용해서 다음과 같은 프로그램을 만들어 봅시다.

  • 게임 직업 및 능력치 설정 에디터 만들기
    • 직업의 종류는 3종류 
      • 직업이 가지는 변수는 이름, 공격력, 체력
    • 프로그램이 시작하면 3종류의 직업을 셋팅해주는 프로그램을 만든다. 
      • 구조체와 구조체 포인터를 이용해서 만들어 보기!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

typedef struct Job // 구조체의 정의 
{
    char name[10];
    int att;
    int HP;
}JOB;

void SetingJob(JOB* pjob,int index) // Set함수 만들기 구조체 포인터를 매개 변수로 선언
{
    printf("===== %d번째 직업 생성 하기 =====\n\n", index);
    printf("===== %d번째 직업 이름 : ", index);
    scanf("%s", &pjob->name);
    printf("===== %d번째 직업 공격력 : ", index);
    scanf("%d", &pjob->att);
    printf("===== %d번째 직업 체력 : ", index);
    scanf("%d", &pjob->HP);
    return;
}

int main()
{
    JOB job[3]; // 직업값을 저장할 구조체 배열 선언
    
    printf("===== 직업 셋팅 에디터 프로그램 =====\n\n");

    for (int i = 0; i < 3; i++) // for문을 이용하여 set함수 진입 및 셋팅 함수 종료후 값 확인
    {
        SetingJob((job + i), i + 1);
        printf("===== %d번째 직업 셋팅이 완료 되었습니다. =====\n", i + 1);
        printf("======= %d번째 직업 이름 : %s\n", i + 1, job[i].name);
        printf("======= %d번째 직업 공격력 %d\n", i + 1, job[i].att);
        printf("======= %d번째 직업 체력 : %d\n", i + 1, job[i].HP);
    }
    printf("\n===== 직업 셋팅 에디터를 종료합니다. =====\n");
    return 0;
}

 

위의 소스코드 처럼 main함수에 필요한 구조체 변수(job [3])을 저장하고 구조체 포인터를 통하여 set함수에서 설정이 가능합니다. 이런 식의 소스코드는 다양한 장점을 가질 수 있습니다.

  • main문 안의 내용이 간결해 집니다. (가독성의 증가)
  • set함수를 만듬으로 직업셋팅이 늘어나도 쉽게 대응 가능합니다 (소스코드의 재사용성 증가)

 

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - Stack Frame (스택 프레임)  (0) 2021.06.26
C 언어 - 다중 포인터  (2) 2021.06.24
C 언어 - typedef 키워드  (0) 2021.06.22
C 언어 - struct(구조체)  (0) 2021.06.22
C 언어 -포인터와 배열  (0) 2021.06.21

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :