프로그래밍[Univ]/데이터구조

데이터 구조를 들어가기전에... 5/18

Cloud Travel 2011. 5. 18. 16:07
 ~프로로그~
 혹시나해서 건너뛰려고 했던 부분을 보았다.
 역시나가 2년이란 시간은 기억을 지우기 시작했었다. 보길 잘했다.
 다른곳에 정확히 써있어 간략하게나마 데이터 구조에 들어가기전에 주의 해야 할 점에 대해서 적어보려고한다.
----------------------------------------------------------------------------------------------------
1. 배열
 같은 자료형의 데이터를 메모리상에 연속적으로 저장하는 자료형
  - 문법
   Type Name[SIZE];
   ex) int A[2]; // A의 이름을 가진 int자료형이 2개 연속됨.


Index가 0 부터 시작 되는 것에 주의 하자!!
초기화가 되지 않아 쓰레기 값이 들어 있다는 의미로 "?"로나타냄.
(버그를 피하기 위해서는 원하는 값 or 0으로 초기화 해주자!!)

  - 초기화
   ① int A[2] = {1,2};
   ② int A[] = {1,2};
    >> 배열의 원소 개수를 지정하지 않아도 초기화 값의 개수에 의해 배열의 크기가 자동으로 지정된다!!
 
  ※ 주의점
   문자배열의 정의 할시 문자열크기 + 1로 size를 정해줘야한다.
   (문자열의 끝을 알려주는 '\0'이 들어갈 공간이있어야된다.)


2. 구조체
 서로다른 자료형(Data Type)을 하나로 묶어논 자료형 
  - 문법
   ① 구조체 구조 선언
   struct STRUCT_NAME{
    Type Name;
     .........
   };
   ex)
    struct id {
     int num;
     char name[10];
    };
   > 구조체 구조 선언은 컴파일러에게 독립적인 구조가 있다는 것을 알려주는 것 뿐이다.
   ② 선언 및 사용
   struct STRUCT_NAME Name = {초기화}; // 초기화는 구조체에 선언된 값의 순서대로 들어간다.
   ex) struct id ID_1 = { 1, "Kim" };
    >> 초기화시 위와 같이 하지 않고 '.'연산자를 이용하여 직접 구조체 변수에 접근하여 바꿀 수 있다.
    ex) struct id ID_2;
          ID_2.num = 2;
          ID_2.name = "Lee";

  - typedef
   새로운 구조체를 하나의 데이터 타입으로 정의하는 것!!

 >> typedef를 이용하여 선언시 구조체 "id"가 데이터 타입으로 정의(일반 자료형처럼 사용 가능)되어,
      struct가 없어도 사용 가능!!


3. 포인터
 메모리 주소 값을 저장하는 변수
 - 문법
  Type *Name;

 

  ex) int *int_ptr = NULL;
  >> 포인터 변수를 초기화 해주지 않으면, 사용시 쓰레기 값에 의해 이상한 메모리에 접근! 치명타가 될 수 있다.

 - 연산자 "*", "&"
  ① & >> 주소연산자 : 변수의 주소 값을 얻을 수 있다.
  ② * >> 참조연산자 : 포인터 변수에 저장된 주소를 이용 해당 주소에 있는 값을 나타낸다.
   ex) 
   int A = 1;
   int *A_prt = &A;
   >> A의 값을 바꾸기 위해서는
   ① A = 2; 
   ② *A_ptr = 2;사용


4. 동적 메모리 할당
 - 동적할당 vs 정적할당
  동적 메모리 할당
   > 장점 : 메모리 활용이 용이하다.
   > 단점 : 복잡하다.
               메모리 사용이 끝나면 메모리 해제를 해줘야한다,
  정적 메모리 할당
   > 장점 : 단순하다.
   > 단점 : 메모리 낭비가 있다.

 - 메모리 할당(stdlib.h 파일 사용)
  ptr_value_name = (tyep *)malloc(size);
  ex) int *int_ptr = (int *)malloc(4*sizeof(int));
   >> int_ptr에 int형을 4개 가진 메모리 공간 부여 = int형 4개짜리 배열 생성

 - 메모리 해제(stdlib.h 파일 사용)
  free(PTR_NAME);
  ※주의점 : 메모리 해제시 NULL값 또는 쓰레기 값이 있을시 프로그램이 죽을 수도 있다.
                 따라서, ptr_name 이 null인지 여부를 판단해야 한다.
 
 - 초기화(string.h 파일 사용)
  memset(ptr_name,value,size);//프로그램 안정성을 위해 필요하다
   >> ptr_name이 가르키는 곳부터 size까지 value값으로 초기화 한다.

※ 메모리 할당/해제/초기화의 예
 int *ptr_int = NULL;
 int size = 10;
 ptr_int = (int *)malloc(sizeof(int)*size); // 메모리할당 (=int 타입의 50개짜리 배열생성)
 if(ptr_int != NULL ){ // ptr_int가 NULL인지 검사 !! 중요!!
  memeset(ptr_int, 0, sizeof(int)*size); // ptr_int 변수가 가르키는 곳부터 sizeof(int)*size까지 0으로 초기화
  free(ptr_int); // 메모리 해제
 }

------------------------------------------------------------------------------------------------------

2중 포인터는 언급하지 않기로 한다''

나중에 필요가 있다고 판단되면 그때 설명 하도록 하겠습니다.