RAM
컴퓨터의 메모리: 데이터를 보관하는 장소
바이트 8 bits 단위로 주소가 지정됨
모든 변수는 주소를 가진다
포인터
메모리 주소를 값으로 가지는 변수
포인터 변수 선언 방식
type-name * variable-name;
ex) int * ptr; : 정수형 포인터 변수 ptr
ptr이 포인터 변수라서 메모리 주소를 저장을 하는데, 그 주소에 저장된 데이터 타입이 int형 변수이다.
연산자 &
변수로부터 그 변수의 주소를 추출하는 연산자
이게 어마무시하게 헷갈렸던 부분
y = *ip
*ip는 포인터변수 ip가 가리키는 주소가 가지고 있는 값
그냥 ip는 ip의 값인 int형 주소값
포인터와 배열은 매우 긴밀히 연관되어 있다
배열a는 포인터 변수와 같이 주소값을 이야기하지만 일반 포인터변수처럼 값을 수정할 수는 없다.
int num[10]; 이면
매개변수를 *num나 num[0]나 num으로 받든 도찐개찐이라는 것
또 헷갈렸던 부분
num[1]은 *(num+1)과 동일 : C에서 포인터변수 + 1은 주소값에 1을 더하는게 아니라 int형이면 4바이트, double이면 8바이트 처럼 자료형의 크기만큼 증가하는 기능을 제공
즉, num[i] 는 *(num+i)와 동일하다는 것
동적 메모리 할당 dynamic memory allocation
프로그램이 실행되는 중에 필요할 때 필요한만큼 메모리를 운영체제로부터 저장공간을 할당받아서 사용하고 사용이 끝나 메모리가 필요 없을 때 저장공간을 해제해 시스템에 메모리를 반납하는 것
변수를 선언해서 데이터를 메모리에 저장하는 것보다
자유롭게 malloc으로 직접 메모리를 할당할 수 있다
=> 더 유연하고 효율적이게 메모리를 사용하고 관리 가능
전역변수와 지역변수로 해결이 되지 않는 상황
생성과 소멸의 시기가 지역변수나 전역변수와 다른 유형의 변수 malloc과 free
함수가 매번 호출될 때마다 새롭게 할당되고 또 함수를 빠져나가도 유지가 되는 유형의 변수
동적메모리가 할당되는 공간: 히프(heap) / 운영체제가 사용되지 않는 메모리 공간을 모아 놓은 곳
int *p;
p = (int *)malloc(sizeof(int)); //위에서 p의 자료형이 int형 *이므로 반환형이 void *인 malloc() 함수의 p도 형변환 해주어야 함
*p = 1000; // p가 가르키는 장소에 1000 저장
free(p); //동적 메모리 반납
- malloc()함수 : size바이트 만큼의 메모리 블록을 할당, 동적 메모리 블럭의 시작 주소를 반환
- 동적메모리는 포인터로만 사용할 수 있음
- free()함수 : 할당된 메모리 블록을 운영체제에게 반환, 해제
** malloc()은 시스템의 메모리가 부족해서 요구된 메모리를 할당할 수 없으면 NULL을 반환한다. 따라서 malloc()의 반환값은 항상 NULL인지 검사하여야 한다.
malloc 함수 호출
- malloc은 메모리 주소를 변수에 저장해서 보관을 해야하니 당연히 그 주소는 *p인 포인터변수 p에 저장
- malloc(개수*sizeof(자료형))이 일반적인 형태
- 만약 malloc을 사용하지 않고 array로 메모리를 할당해주었다면 추후 array의 크기를 malloc을 사용한 tmp를 활용해 수정했을 때 오류가 뜬다
array는 값의 수정이 불가능하니까 !
'자바 Java' 카테고리의 다른 글
추상클래스 추상메서드 (0) | 2019.10.16 |
---|---|
문자열 (0) | 2019.10.09 |
선행처리 (0) | 2019.10.06 |
다중 포인터 (0) | 2019.10.06 |
배열 / 다차원 배열 ( 2차원 배열 / 3차원 배열 ) (0) | 2019.10.05 |
댓글