혹시나해서 건너뛰려고 했던 부분을 보았다.
역시나가 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
새로운 구조체를 하나의 데이터 타입으로 정의하는 것!!
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중 포인터는 언급하지 않기로 한다''
나중에 필요가 있다고 판단되면 그때 설명 하도록 하겠습니다.