본문 바로가기

CS/자료구조

[인프런|1강] C로 배우는 자료구조 | C언어 기초 문법 리뷰

1.C언어 기초 문법 리뷰 - 배열, 포인터, 문자열, 동적메모리할당

  • 메모리
    • 컴퓨터의 메모리는 데이터를 보관하는 장소
    • 바이트(8bit) 단위로 주소가 지정
    • 모든 변수는 주소를 가진다.

 

  • 포인터: 메모리의 주소를 값으로 가지는 변수

type-name * variable-name;

int * ptr;

 

int c = 12;

int *p;

p = &c;   // *p =>12, p=> 변수 c의 주소가 담김

 

int x=1, y=2;

int * ip;

ip = &x;

y = *ip;

*ip = 0;


포인터를 쓰는 이유: 데이터 할당을 더욱 유연하게 하기위해서 

                                  저장하려는 데이터 사이즈를 (배열 등에) 크게하기도 했다 작게하기도 하기 위해, 연결리스트 등 다른 자료구조에서도 데이터를 할당의 유연성을 위해

 

  • 포인터와 배열

배열 a의 a, a[0] => *a와 같음 

배열 변수명에는 배열의 시작 주소를 값으로 가지고 있다.

 

  • 포인터 arithmetic
    • *a와 a[0]는 동일한 의미
    • a[1] 은 *(a+1)과 동일하고, a[i]는 *(a+i)와 동일하다.

 

 

        

 

  • 동적메모리 할당
    • 변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 이것을 동적 메모리 할당(dynamic memory allocation)이라고 부른다.
    • malloc 함수를 호출하여 동적메모리 할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환한다.

 

  • 배열 키우기 

 

기존에 쓰던 배열에 공간이 모자르면 

새로운 배열 공간을 만든다. 

기존 배열에 있던 값을 새로운 배열에 복사한다.

이후 기존 배열을 가르키던 포인터 변수 새로운 배열을 가르키게 설정한다.

여기서 배열이 포인터 변수로 ex) int *a[]; 와 같은 식으로 선언되지 않은 상태였다면 ex) int a[]

새로운 배열을 a[], a[0], a가 가르킬 수 없다. 

오직 *a로 선언되었어야지만 가능하다. 

포인터형이 아닌 배열a[]는 가르키는 초기 주소값이 고정되어있다.

그러므로 동적할당 등을 하고 싶다면 포인터형 배열로 선언했어야만 가능하다.

동적할당이 제대로 되었다면 기존배열은 메모리에서 해제해주어야 불필요한 메모리 낭비를 막을 수있다.


강의만 보았을때 이해되는 느낌이었지만 확실히 조금이나마 정리하니 기억에 더 남는다.