본문 바로가기
CS(computer science) 지식/자료구조

[자료구조] 포인터(pointer), 메모리- 기본기를 탄탄하게 (1)

by QueryJun 2022. 10. 29.

메모리

포인터(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;
}

 

반응형