본문 바로가기

C언어/C언어 문법

[C언어] 구조체(struct), 구조체 배열, 구조체 포인터, 화살표 연산자, 구조체 변수의 주소값

728x90
반응형

구조체

 

구조체를 사용하면 여러 가지 변수들을 하나로 묶는 것이 가능하다.

 

예를 들어 30명의 학생들의 5가지 신상정보를 기록하려고 할 때 150가지 변수를 선언할 필요가 없게 되는 것이다.

 

구조체를 선언하는 방법은 아래 코드와 같다.

 

struct Information
{
    char name[20];
    int age;
    int stdID;
    char gender;
    char address[100];
};

 

 

 

 

 

구조체 변수를 사용하려면 구조체를 선언한 후에 구조체 변수도 선언해주어야 한다.

구조체 변수는 'struct 타입이름 변수이름;' 의 형태로 선언할 수 있다.

 

구조체 변수를 선언한 후에는 연산자 . 을 통해 접근할 수 있다.

 

초기화를 할 때에는 배열에 넣을 때와 마찬가지로 중괄호 안에 데이터를 넣고 쉼표를 사용하여 구분해주면된다.

 

위 코드를 응용하여 구조체 변수를 하나 만들어보겠다.

 

#include <stdio.h>
#pragma warning(disable:4996)

struct Information
{
    char name[20];
    int age;
    int stdID;
    char gender;
    char address[100];
};

int main ()
{
    struct Information stdinfo = {"Enchupin", 23, 20210001, 'M', "서울특별시 xxxx..."};

    printf("%s\n", stdinfo.name);
    printf("%d\n", stdinfo.age);
    printf("%d\n", stdinfo.stdID);
    printf("%c\n", stdinfo.gender);
    printf("%s", stdinfo.address);

    return 0;
}

 

 
 

 

 

위 코드를 실행시켜보면 입력한 값이 그대로 출력되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

구조체 배열

 

구조체 하나를 선언하고 해당 구조체로 여러 개의 구조체 변수를 선언할 수도 있다.

 

#include <stdio.h>
#pragma warning(disable:4996)

struct Information
{
    char name[20];
    int age;
    int stdID;
    char gender;
    char address[100];
};

int main ()
{
    struct Information stdinfo1;
    struct Information stdinfo2;
    struct Information stdinfo3;
    
    return 0;
}
 

 

 

 

 

 

그러나 위 코드처럼 작성할 경우 구조체 변수를 작성하는 의미가 줄어든다.

 

이럴 때에는 구조체 변수를 배열로 선언할 수도 있다.

 

#include <stdio.h>
#pragma warning(disable:4996)

struct Information
{
    char name[20];
    int age;
    int stdID;
    char gender;
    char address[100];
};

int main ()
{
    struct Information stdinfo[30];
	int i;
	
    for (i=0;i<30;i++)
    {
        scanf("%s\n", stdinfo[i].name);
    	scanf("%d\n", &stdinfo[i].age);
    	scanf("%d\n", &stdinfo[i].stdID);
    	scanf("%c\n", &stdinfo[i].gender);
    	scanf("%s", stdinfo[i].address);
    	
    	printf("\n%s\n", stdinfo[i].name);
    	printf("%d\n", stdinfo[i].age);
    	printf("%d\n", stdinfo[i].stdID);
    	printf("%c\n", stdinfo[i].gender);
    	printf("%s\n\n", stdinfo[i].address);
    }
    
    return 0;
}
 

 

위 코드처럼 작성하면 150개의 변수 선언을 6개로 줄일 수 있게 된다.

 

 

 

 

구조체 배열을 초기화 할 때에는 다차원배열을 초기화하는 것처럼 중괄호를 중첩해서 사용하면 된다.

 

예시로 아래 코드처럼 사용할 수 있다.

 

struct PhoneNumber
{
    char name[20];
    int age;
    char gender;
}

int main ()
{
    struct Information stdinfo[3] = {{"김씨", 20, 'F'}, {"박씨", 21, 'F'}, {"정씨", 22, 'M'}};
    
    
.... }

 

 

 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

구조체 포인터

 

구조체 변수를 포인터로 선언할 수도 있다.

 

선언하는 방법은 포인터를 선언할 때와 마찬가지로 변수명과 자료형 사이에 애스터리스크를 넣어주면 된다.

 

구조체 포인터 변수를 역참조하는 방법은 . 연산자와 애스터리스크를 사용하는 방법도 있지만

화살표 연산자를 사용하는 방법도 있다.

 

예시로 구조체 포인터 변수를 선언하고 역참조하는 코드를 작성해 보겠다.

 

#include <stdio.h>
#include <stdlib.h>

struct Person {
    int ID;
    int age;
};

int main ()
{
    struct Person *a1 = malloc(sizeof(struct Person));
    (*a1).ID = 1234;
    a1->age = 23;
    
    printf("id : %d\n", a1->ID);
    printf("age : %d", (*a1).age);
}
 

 

 

위 코드를 실행하면 입력한 ID와 나이가 정상적으로 출력되는 것을 알 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

구조체 변수의 주소값

 

구조체 변수의 주소값은 배열과 마찬가지로 첫 번째 멤버(데이터)의 주소값과 동일하다.

 

이 내용은 아래 코드로 확인이 가능하다.

 

 

#include <stdio.h>

struct Pos {
    float x;
    float y;
};

int main()
{
	struct Pos Apos;
	struct Pos Bpos;
	
	printf("%p %p %p\n", &Apos, &Apos.x, &Apos.y); 
	printf("%p %p %p\n", &Bpos, &Bpos.x, &Bpos.y);
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형