메모리
포인터(pointer)를 이해하기 이전에 메모리를 먼저 이해해야 함
메모리란 아래 3가지 특징을 가진다
- 컴퓨터의 메모리는 데이터를 보관하는 장소
- Byte(8 bits) 단위로 지정
- 모든 변수는 주소를 가짐
포인터
포인터(pointer)는 메모리 주소를 값으로 가지는 변수
int num = 12;
int *p; // 포인터 변수 p 선언
p = # // 포인터 변수 p에 변수 num의 주소를 저장
- 연산자 &는 변수로부터 그 변수의 주소를 추출하는 연산자
- 연산자 *는 치환문의 왼쪽, 오른쪽 위치에 따라 의미하는 바가 다름
ㄴ 오른쪽 : 변수가 가진 값
int tmp = *p; 라고 선언 했을 때, p는 현재 num의 주소를 가지고 있으므로 12를 의미함 // tmp에 12라는 값을 씀
ㄴ 왼쪽 : 변수가 지정하는 자리
*p = 0; 이라고 선언 했을 때, 포인터 변수 p가 현재 저장하고 있는 주소를 의미함 // 포인터 p의 주소 즉 변수 num에 0을 씀
포인터와 배열
int a[10]; // 10개의 정수를 수용할 수 있는 메모리(40바이트)가 할당됨
- *a와 a[0]은 동일한 의미
- a[1]와 *(a+1)은 동일한 의미를 가짐, // a는 정수형 포인터 변수이고, 메모리 공간에서 하나의 정수는 4바이트를 차지하여 주소 +4
ㄴ 즉 a[i]와 *(a+i)는 동일
동적 메모리 할당(dynamic memory allocation)
동적 메모리 할당이란 변수를 선언하는 대신 프로그램의 요청으로 메모리 할당하는 것
malloc 함수를 활용하여 동적 메모리 할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환함
#include<stdio.h>
int main(void){
int *p;
p = (int *)malloc(40); //할당받을 메모리의 크기를 byte 단위로 지정
if (p==NULL){
/* 동적 메모리 할당 실패로적절한 조치를 취한다 */
}
p[0] = 7;
p[1] = 124;
*(p+2) = 542;
}
|
동적으로 할당된 배열 공간이 부족할 경우, 더 큰 배열을 할당하여 사용 가능
#include<stdio.h>
int main(void){
int * array = (int *)malloc(4*sizeof(int)); // 배열 array의 크기가 부족할 경우
int * tmp = (int *)malloc(8*sizeof(int));
int i;
for (i=0; i<4; i++)
tmp[i] = array[i];
array = tmp;
}
|
'CS(computer science) 지식 > 자료구조' 카테고리의 다른 글
[자료구조] 스택(Stack)을 이용한 미로찾기 (5) (2) | 2022.11.23 |
---|---|
[자료구조] 스택(Stack)의 후위표기식으로 변환(괄호가 있는 경우) (5) (0) | 2022.11.14 |
[자료구조] 스택(Stack)의 응용 중위표기식 -> 후위표기식 (4) (0) | 2022.11.11 |
[자료구조] 스택(Stack)의 응용 후위표기식 - python을 통한 실습 (3) (0) | 2022.11.11 |
[자료구조] 스택(Stack)의 이해 - python을 통한 실습 (2) (0) | 2022.11.09 |