새소식

👩‍💻 C

C언어 - <구조체> 화살표 연산자, 멤버 , 구조체 메모리 할당 , 구조체 포인터

  • -

* 구조체(Data structure)란 ?

프로그램의 규모가 커진다면, 변수를 계속해서 선언하는것은 비효율적이다. 이때 구조체를 사용하면 좀 더 효율적이다.

예를들어서, 100명의 사람의 인적사항을 저장하는 프로그램이라면, 100명 * (이름 , 나이, 주소) 까지 300백개의 변수가 필요하다. 구조체를 선언한다면, 구조체 속에 이름, 나이, 주소 3가지만 선언하고, 사람단위로 정보를 처리 할 수 있다.

 

* 구조체의 선언

기본적인 선언 방법
struct Person{
	char name[10];
	int age;
	char address[30];
};
  • 구조체는 위와 같이 선언한다.
  • Person : 구조체 이름
  • name, age, address : 구조체의 멤버 라고 한다.
  • 구조체는 보통 main함수 밖에 정의한다. (전역적으로 사용하기 위함이다)

 

구조체를 이용하여 2명의 인적사항 생성하기.
#include <stdio.h>

struct Person{
	char name[20];
    int age;
    char address[20];
};

int main(void)
{
	struct Person p1 = {.name = "kim", .age = 30, .address = "seoul"};
	struct Person p2 = {.name = "lee", .age = 20, .address = "tokyo"};
	printf("p1's name : %s, p2's name : %s", p1.name, p2.name);
}

p1, p2는 "구조체 변수"이다. 그리고 구조체 속의 요소에 접근할때는 <.멤버이름>으로 접근하면 된다.

 


 

# Typedef를 이용한 구조체 선언

typedef 는 자료형의 별칭을 만드는 기능이다. 구조체를 만들때도 사용하지만, 다른 모든 자료형에도 사용 가능하다.

typedef <자료형> <별칭> 으로 사용 가능하다.

typedef int NUMBER;
// int를 NUMBER라는 별칭으로 만들었다.

NUMBER a = 9;
// 즉, int a = 9; 와 동일하다
printf("%d",a);

 

typedef로 구조체 선언하기
typedef struct Person {
	char name[20];
    int age;
    char address[30];
}	p_list;

int main(void)
{
	p_list = p1;
    
}
  • struct Person  p1; 대신, 별칭을 사용하여 p_list p1; 으로 구조체를 선언할 수 있다.
  • 이때, typedef와 별칭(t_list)은 사용하되 구조체의 이름(Person)을 적지 않고 구조체를 선언한다면, 익명구조체 라고 한다.

 

# 구조체 포인터

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

struct Person {
	char name[20];
    int age;
    char address[30];
}

int main(void)
{
	struct Person *p1 = malloc(sizeof(struct Person));
    //구조체 포인터 선언을 하기 위한 메모리 할당.
    strcpy(p1->name, "lee");
    p1->age = 30;
    free(p1); // 메모리 해제
}
  • 구조체 포인터의 경우에는 <.멤버이름>이 아닌, <구조체->멤버>로 접근하면 된다. (->는 화살표 연산자 라고 한다)
  • 문자열 멤버에는 =(할당연산자) 사용이 안되므로, strcpy함수를 이용하여 문자열을 넣어주면 된다.

 

# 구조체 멤버가 포인터인 경우

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

struct Data {
	char c1;
    int *numPtr;
}

int main(void)
{
	int num1 = 10;
    struct Data d1;
    struct Data *d2 = malloc(sizeof(struct Data));
    
    d2->numPtr = &num1;
    printf("%d\n", *d2->numPtr);
    free(d2);
};

접근하려는 멤버가 포인터인 경우에는 참조연산자 *를 붙여줘야한다.

  • *d2->numPtr
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.