C 포인터와 동적 메모리 할당 리뷰(1)
(Pointers and Dynamic Memory Allocations)
• 포인터
– C언어에서는 어떤 타입 T에 대해 T의 포인터 타입이 존재
– 포인터 타입의 실제값은 메모리 주소가 됨
– 포인터 타입에 사용되는 연산자
• & : 주소 연산자
• * : 역참조(dereferencing, 간접 지시) 연산자
Ex) i(정수 변수), pi(정수에 대한 포인터)
int i, *pi
pi = &i;
i에 10을 저장하기 위해서는 다음과 같이 할 수 있다.
i = 10; 또는 *pi = 10;
– 널(null)포인터 : 어떤 객체나 함수도 가리키지 않는다.
• 정수 0값으로 표현
• 널포인터에 대한 검사
int (pi == NULL) 또는 if(!pi)
C 포인터와 동적 메모리 할당 리뷰(2)
(Pointers and Dynamic Memory Allocations)
동적 메모리 할당
– 프로그램을 작성할 때 얼마나 많은 공간이
필요한지 알 수 없을 때 사용
– 히프(heap) 기법
– 새로운 메모리 공간이 필요할 때마다 함수
malloc을 호출해서 필요한 양의공간을 요구
동적할당의 필요성
• 필요성
– MAX_SIZE=100 → MAX_SIZE=1000 ←컴파일을 다시 해야
– 배열의 크기가 프로그램 실행시간에 동적으로 변할 경우
– 배열의 크기를 결정하기 힘들 때, 실행시간을 미루었다가 배열의 크기
가 정해지면 동적으로 할당
N차원 배열
●2차원 배열 → 차원이 커지더라도, 배열의 배열로 생각
-2차원 → 1차원 배열의 1차원 배열
-3차원 → 2차원 배열의 1차원 배열
●2차원 배열의 동적 생성
/* create a two dimensional rows cols array */
int **make2dArray(int rows, int cols)
{
int **x, i;
/* get memory for row pointers */
MALLOC (x, rows * sizeof (*x)); ==> 주소를 담는 8byte를 row개 만큼 만들어서 x에 넘긴다.
/* get memory for each row */
for (i = 0; i < rows; i++)
MALLOC(x[i], cols * sizeof(**x)); ==> 값을 저장
return x;
}
원소 x[i][j]를 찾을 때.
x[i]에 있는 포인터에 접근
●calloc / realloc 함수
– calloc : 사용자가 지정한 양의 메모리를 할당 후 0으로 초기화
– realloc : malloc이나 calloc으로 이미 할당된 메모리 크기 재조정
●3차원 배열
2차원의 1차원 배열
'Data Structure' 카테고리의 다른 글
배열 (0) | 2023.02.15 |
---|---|
자료구조란? (0) | 2023.02.15 |