[자료구조] #3 C언어 구조체, 포인터, 동적할당

또상·2021년 12월 15일
0

Data Structure

목록 보기
1/4
post-thumbnail

3. 구조체

1. struct

  • 배열 : 자료형(타입)이 같은 자료들을 하나로 묶는 방법
  • 구조체 : 자료형이 다른 자료를 하나로 묶는 방법

지금 보니까 좀 속은 것 같다. js는 타입이 달라도 배열로 만들 수 있는걸..?

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

struct person a; // 구조체 변수 선언
// typedef
typedef struct _person {
    char name[10];
    int age;
    float height;
    char address[80];
} person;

person a;
person b;
a = b; // 대입은 가능!
a > b; // 비교는 불가능!

2. 자기참조 구조체

구조체의 필드(변수) 중에서 자기 자신을 가리키는 포인터가 존재하는 구조체.

연결리스트 구현에 많이 이용한다!!

typedef struct _ListNode {
    char data[10];
    struct _ListNode *link; // 포인터는 뭔데?
} ListNode;



4. 포인터

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

1. 포인터 기본 문법

char a = 'A';
char *p;
p = &a; // & : 변수의 주소

*p = 'B'; // * : 가르키는 곳의 내용
p // 포인터의 값 (주소)
*p // 포인터가 가리키는 값
*p++ *(p++) // 포인터가 가리키는 값을 가져온 후, 포인터(주소)가 한칸 증가.
*p-- *(p--) // 포인터가 가리키는 값을 가져온 후, 포인터(주소)가 한칸 감소.
(*p)++ // 포인터가 가리키는 값을 증가!!

2. call by reference

함수에 인자로 포인터를 넘기면, 외부 인자의 값을 변경할 수 있다.

void swap(int *px, int *py) {
    int tmp;
    tmp = *px;
    *px = *py;
    *py = tmp;
}

int a = 1, b = 2;
swap(&a, &b);

3. 배열과 포인터

배열의 이름 == 포인터!

int A[5];
int *aPtr;
//
aPtr = A; aPtr = &A[0]; // 같은 의미!!
A[0] == *(A+0); // 포인터로 표현하면 이렇게 된다.
A[1] == *(A+1);
A[2] == *(A+2);

위와 같이 포인터에 대한 사칙연산은 포인터가 가리키는 객체 단위로 계산된다.

int a;
int *p;
p = &a;
p+1 // a의 다음칸 : 뭐가 있는지 모름..
// int면 4byte double이면 8byte씩 이동하게 됨.
// 동적 메모리 할당할 때 배열을 넣으면 이런 식으로 이용하기 때문에 잘 알아두자.

4. 구조체의 포인터

struct {
    int i;
    float f;
} s, *ps;

ps = &s;
ps->i = 2; // 구조체 포인터에서 변수에 접근하려면 ->
ps->f = 3.14;

5. 포인터의 포인터

*을 중첩해서 포인터를 가리키는 포인터 변수를 만들 수 있다.

int a;
int *p;
int **pp;
*p = &a;
**p = &p; // 두개까지 쓸 일이 있다고?! 있더라...

6. 포인터 사용 시 주의할 점

  • 포인터가 아무것도 가리키지 않을때는 NULL로 설정하자.
int *pi = NULL;
  • 타입 변환 시에는 명시적으로!!!!
int *pi;
float *pf;
pf = (float *)pi;




5. 동적메모리 할당

C는 정적 메모리 할당 언어임.

  • 메모리 크기는 프로그램 시작 전에 결정된다
  • 프로그램 도중에 실행 크기가 변경될 수 없기 때문에,
    int buffer[1000] 이렇게 미리 선언해놔야 함.

동적 메모리 할당

  • 프로그램의 실행 도중에 메모리를 할당 받는 것.
  • 필요한 만큼 받아서 사용하고, 필요 없어지면 반납해야함.
  • 효율적으로 사용 가능.
int *pi;
pi = (int *)malloc(sizeof(int) * 3); // int 3개의 사이즈만큼 메모리 블록을 할당해준다.
// pi가 필요한 작업 수행
free(pi);

js에서는 자동으로 해주는데...




6. 작은 회고

  • 오랜만에 C 보니까... 재밌다! 그치만 자료구조 코드들 본격적으로 복습하면 이중 포인터 때문에 헷갈리겠지..?
  • 목요일에 2시간반 수업듣고 1시간 실습 과제하고
profile
0년차 iOS 개발자입니다.

0개의 댓글