C언어로 쉽게 풀어쓴 자료구조

[C언어로 쉽게 풀어쓴 자료구조] 3장 배열, 구조체, 포인터

studyingalone 2024. 11. 6. 16:53
728x90

C언어로 쉽게 풀어쓴 자료구조: 3장 배열, 구조체, 포인터

3.2 구조체

구조체란?

타입이 다른 데이터를 묶는 방법

struct studentTag{
    char name[10];
    int age;
    double gpa;
};

 

※위의 문장은 구조체 형식만을 정의. 실제로 구조체가 만들어진 것은 아니다

 

구조체를 만들려면 다음과 같의 정의

struct studentTag s; // struct 구조체이름 구조체변수;

 

구조체 안에 들어 있는 멤버를 사용하려면 

strcpy(s.name, "kim");
s.age = 20;
s.gpa = 4.3;

typedef을 사용한 구조체 정의

typedef studentTag{
    char name[10];
    int age;
    double gpa;
} student;

 

이 경우 student만을 사용하여 변수 선언이 가능해진다.

student s;

 

구조체는 중괄호를 사용하여 선언 시에 초기화하는 것이 가능하다.

student s = {"kim", 20, 4.3};

 


3.5 포인터 

포인터란?

다른 변수의 주소를 가지고 있는 변수

& 연산자 주소 연산자
➡️ 변수의 주소 추출
* 연산자 간접참조 연산자
➡️ 포인터가 가리키는 곳에 값을 저장

 

int a;
p = &a;  // 변수의 주소를 포인터에 저장 
&a = 0x0010    -> &는 변수의 주소 추출
*p = 200;   // p가 가리키는 장소에 200을 저장 *p -> a이므로 a에 200을 저장

 

 


void swap(int A, int B){
    int temp = A;
    A = B;
    B = temp;
}
int main (){
    int a = 10;
    int b = 20;
    
    printf("a = %d, b = %d\n", a, b);
    swap(a,b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

 

출력
a = 10, b = 20
a = 10, b = 20

 

※ swap 종료시 swap에 저장된 값은 사라진다.

 

따라서 a와 b에 저장된 값을 swap하기 위해서는 포인터 연산자를 사용해야 한다.

void swap(int *A, int B){
    int temp = *A;
    *A = *B;
    *B = temp;
}
int main (){
    int a = 10;
    int b = 20;
    
    printf("a = %d, b = %d\n", a, b);
    swap(&a,&b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

 

 

출력
a = 10, b = 20
a = 20, b = 10

 


3.6 동적 메모리 할당

왜 사용할까?

int scores[100];

학생의 성적을 저장하는 배열 scores는 크기가 100으로 고정되있다. 

처음 결정된 '100' 이라는 크기보다 더 큰 입력이 들어온다면 처리하지 못할 것이고 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비될 것이다. 


 

이러한 문제를 해결하기 위해 필요한 만큼의 메모리를 운영체제로부터 할당받아서 사용하고, 사용이 끝나면 시스템에 메모리를 반납한다. ➡️동적 메모리 할당(dynamic memory allocaton)

int *p;
p = (int *)malloc(sizeof(int));    // 동적 메모리 할당
*p = 100;  // 동적 메모리 사용
free(p)   // 동적 메모리 반납
  • malloc() 함수는 size바이트 만큼의 메모리 블록을 할당
  • sizeof는 변수나 타입의 크기를 숫자로 반환한다.(크기의 단위는 바이트)
  • sizeof(int)는 int형의 크기를 반환한다. (4byte)
  • malloc()은 동적 메모리 블럭의 시작 주소를 반환한다.
  • 반환되는 주소의 타입은 void *이다. 따라서 이를 적절한 포인터로 형변환해야한다. (int *)

 


구조체와 포인터

구조체에 대한 포인터를 선언하고 포인터를 통하여 구조체 멤버에 접근할 수 있다. 

(*p).i

 

p -> i

위의 두가지 방법으로  접근이 가능하다. (둘 다 같은 의미이다.)

 

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

typedef struct studentTag 
{
    char name[10];
    int age;
    double gpa;
} student;

int main(void)
{
    student *s;
    
    s = (student *)malloc(sizeof(student));
    if(s == NULL)
    {
    	fprintf(stderr, "메모리부족\n");
        exit(1);
    }
    
    strcpy(s->name, "Park");
    s->age = 20;
    
    free(s);
    return 0;
}
728x90
반응형