포인터 배열
요소로 포인터 변수를 가지는 배열이다.
int num1 = 1, num2 = 2, num3 = 3;
int* arr[3] = {&num1,&num2,&num3};
배열 포인터
배열을 가리킬 수 있는 포인터이다.
*사용 이유 : 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있기 때문이다. 즉, 포인터를 배열처럼 사용하기 위해 배열 포인터를 정의하여 사용한다.
#include <stdio.h>
int main(void){
int arr[2][3] = { {1,2,3} , {4,5,6} };
int (*pArr)[3] = arr;
printf("%d", arr[1][1]); //배열 이름으로 참조
printf("%d", pArr[1][1]); //배열 포인터로 참조
}
//출력결과 5 5
동적 할당
배열은 정적 크기로 할당이 된다. 크기가 고정된 배열은 정해진 크기를 초과할 경우 할당받은 기억공간이 없으므로 값을 저장할 수 없다는 문제점을 가진다. 반대로 최대한 넉넉하게 메모리를 부여할 경우 무의미한 공간을 점유하게 될 수도 있다. 따라서 정적인 크기로 계속 가지고 있을 데이터와 동적으로 사용 후 다시 메모리에 반환하는 데이터를 구분하여 할당할 수 있어야한다.
C에서 힙 메모리는 런타임 도중에 프로그래머에 의해 동적으로 할당되고 반환되는 메모리 영역이다. 힙 영역을 할당받을 때, 시스템은 힙 메모리의 주소를 반환하기 때문에 접근하기위해서는 시스템이 제공해준 주소값을 저장할 포인터를 미리 선언해야한다.
C에서 동적할당을 진행해주는 함수는 malloc(), calloc(), realloc() 가지로 <stdlib.h>에 정의되어 있다.
malloc()
프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해준다. malloc() 함수는 인수로 할당받으려는 메모리 크기를 바이트 단위로 전달받고, 크기에 맞는 할당되지 않은 블록을 찾아 주소값을 반환해준다.(첫 번째 바이트를 가리킴) 블록이 없을 때에는 NULL 포인터를 반환한다.
free()
힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환하는 함수이다. 메모리를 반환해주지 않으면 메모리가 부족해지는 현상이 발생할 수 있다. free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받는다.
calloc()
malloc과 같이 힙 영역에 메모리를 동적으로 할당하나, 1)할당하고자 하는 메모리 크기를 두 개의 인수로 나누어 전달 받고, 2) 할당된 영역들의 비트값을 0으로 초기화해준다는 점에서 다르다.
calloc(size_t n, size_t size) --> 첫 번째 인수는 메모리 블록의 개수(배열길이)를 나타내며, 두 번째 인수는 각 블록의 바이트 수(자료형)를 나타낸다.
realloc()
이미 할당된 힙 메모리의 크기를 바꾸어 재할당할 때 사용하는 함수.
realloc(void *ptr, size_t s) --> 첫 번째 인수는 크기를 바꾸고자하는 메모리를 가리키는 포인터를 나타내며, 두 번째 인수는 해당 메모리 공간에 재할당할 크기를 전달한다.
'2학년 > C' 카테고리의 다른 글
[C]사용자 지정 타입 (0) | 2023.07.29 |
---|---|
[C]사용자 지정타입(1) (0) | 2023.07.28 |
[C]배열(1) (0) | 2023.07.26 |
[C]포인터(2) (0) | 2023.07.25 |
[C]포인터(1) (0) | 2023.07.24 |