티스토리 뷰

 

메모리와 포인터에 들어가기에 앞서, 메모리에 대해 간략하게 소개하겠습니다.

 

변수의 본질은 메모리이며 모든 메모리는 자신의 위치를 식별하기 위한 근거로 고유번호(일련번호)를 갖는데, 이 번호를 메모리의 주소라 합니다.

 

메모리의 종류

메모리는 그 용도에 따라 스택(stack), 힙(heap), 데이터 영역(data section), 텍스트 영역(text section) 등으로 나누어 집니다.

분류

특징

Stack 자동변수이고 지역변수인 변수가 사용하는 메모리 영역 / 크기가 작고 관리(할당 및 반환)가 자동으로 이루어 지는 장점입니다.
Heap 동적 할당할 수 있는 자유 메모리 영역이며, 개발자 스스로 관리(수동)해야 합니다. 따라서 대량의 메모리가 필요하거나 필요한 메모리의 크기를 미리 알 수 없을 때 사용합니다. 제일 큰 영역입니다.
PE image (실행영역) Text section C언어의 소스코드가 번역된 기계어가 저장된 메모리 영역이며, 기본적으로 읽기전용 메모리입니다.
Data section(Read only) 상수 형태를 기술하는 문자열(예: "Hello")이 저장된 메모리 영역입니다.
Data section(Read/Write) 정적변수나 전역변수들이 사용하는 메모리 영역이며, 별도로 초기화하지 않아도 0으로 초기화됩니다. 관리는 자동이기 때문에 Heap 영역 메모리처럼 할당 및 해제를 신경 쓸 필요 없습니다.

 

 

포인터 변수의 선언 및 정의

포인터 변수란 메모리의 주소를 저장하기 위한 전용 변수입니다.

 

메모리를 지정하는 방법에는 직접 지정과 간접 지정으로 나눌 수 있습니다.

ㄴ직접 지정의 사례로는 '변수 선언'을 사례로써 볼 수 있습니다.

 

간접 지정을 설명하기에 앞서 저희는 scanf() 함수를 사용할 시, '&nData'라는 형식의 주소 연산자를 사용합니다. 주소 연산자를 풀어보면 "이름이 nData인 메모리의 실제 주소는?"라고 해석할 수 있습니다. 주소 연산과 정반대 되는 개념의 연산자가 바로 '간접 지정 연산자(*)'입니다.

 

다시 설명해보면, 간접지정은 변경될 수 있는 임의의 기준주소로 상대적인 위치(주소)를 식별하는 방식입니다. 어떠한 기준을 근거로 상대인 메모리의 위치를 설명하는 방법이 '간접지정'이라고 교재는 설명하고 있습니다.

 

포인터 변수에 주소가 저장되는 방식은 Little Endian이라는 개념을 따릅니다.

 

#include<stdio.h>

int main(void) {

	int x = 10;
    
	// 변수 x를 가리키는 int형식에 대한 포인터 변수 선언 및 정의
	// pnData 에 x의 주소가 저장
	int* pnData = &x;

	printf("x : %d\n", x);

	// pnData 포인터 변수가 가리키는 대상 메모리를 int형 변수로 간접지정하고 20을 대입한다.
	// 현재 가리키는 대상 메모리는 변수 x의 메모리이므로 x의 값은 20이 된다.
	*pnData = 20;
    
	printf("x : %d\n", x);
	return 0;
}

*nTest = 20; 이러한 경우 저장된 주소의 값을 수정합니다.

*연산자*이름저장된 주소로 가 그 주소의 값을 수정, 참조할 수 있는 연산자라는 생각이 듭니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함