티스토리 뷰

구조체


구조체(structure) - 타입이 다른 데이터를 하나로 묶는 방법

 

● 구조체 선언 

// 구조체 선언

struct person {
    char name[10];
    int age;
    float height;
};

// 구조체 변수 선언
struct person a;

 

● typedef를 이용한 구조체 선언 (typedef를 사용하면, 구조체 변수를 선언할 때, struct를 붙이지 않아도 됩니다.)

// typedef를 이용한 구조체 선언

typedef struct person{
    char name[10];
    int age;
    float height;
} person;

// 구조체 변수 선언
person a;

 

● 자체참조 구조체 (필드 중에 자기 자신을 가리키는 포인터가 한 개 이상 존재하는 구조체)

typedef struct ListNode {
    char data[10];
    struct ListNode *link;
} ListNode;

 

배열


배열(array) - 타입이 같은 데이터들을 하나로 묶는 방법

 

● 1차원 배열 

배열의 경우 메모리에 1차원 형태로 저장됩니다.

 

● 2차원 배열

그럼 2차원 배열은 어떻게 저장될까요? -> 2차원 배열 역시 똑같이 1차원 형태로 저장됩니다. 

A[0][0] - A[0][1] - A[0][2] - A[0][3] - A[1][0] - .... 이런 식이죠. 

 

포인터


포인터 - 다른 변수의 주소를 갖고 있는 변수

    char a = 'A';
    char *p; // 포인터 선언
    p = &a; // 포인터에 a의 주소값 대입
    
    *p ='B'; // 포인터가 가리키는 값 변경

 

 

● 배열과 포인터 

배열의 이름 - 사실상 포인터와 같은 역할, (컴파일러가 배열의 이름을 배열의 첫번째 주소로 대치합니다.)

 

● 구조체와 포인터 

구조체의 요소에 접근하기 위해서는 연산자 '->' 를 사용합니다.

    struct {
        int i;
        float f;
    } s, *ps;
    
    ps = &s;
    ps -> i = 2;
    ps -> f = 3.14;

 

● 포인터의 포인터

    int a; // 정수 변수 선언
    int *p; // 정수 포인터 선언
    int **pp; // 정수 포인터의 포인터 선언
    p = &a; // 변수 a - 포인터 p 연결
    pp = &p; // 포인터 p - 포인터의 포인터 pp 연결

 

● 포인터 연산

 

동적 메모리 할당


프로그램이 메모리를 할당받는 방법

1. 정적 메모리 할당

2. 동적 메모리 할당

 

● 정적 메모리 할당

메모리의 크기 프로그램이 시작하기 전 결정.

프로그램 수행 도중 크기 변경 불가 -> 처음 결정된 메모리 크기보다 더 큰 입력이 들어오면 처리 불가, 더 작은 값이 들어오면 메모리 낭비

ex) int buffer[100];

 

● 동적 메모리 할당

프로그램의 실행 도중에 메모리 할당

필요한 만큼 할당받고 사용한 후, 메모리 반납 -> 메모리의 효율적인 사용 가능

    int * pi;
    pi = (int *)malloc(sizeof(int)); // 동적 메모리 할당
    ...
    ...       // 동적 메모리 사용
    ...
    free(pi); // 동적 메모리 반납
댓글
링크
최근에 올라온 글
최근에 달린 댓글