Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

히바리 쿄야 와 함께 하는 Developer Cafe

[3일차] DO IT C언어 입문/p290~p454/ 포인터,프로세스와메모리할당,다차원포인터 본문

C언어

[3일차] DO IT C언어 입문/p290~p454/ 포인터,프로세스와메모리할당,다차원포인터

TWICE&GFRIEND 2021. 5. 15. 13:52
포인터란?

C언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부릅니다.

char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다.


포인터 연산자
C언어에서 포인터와 연관되어 사용되는 연산자는 다음과 같습니다.

 
1. 주소 연산자(&)
2. 참조 연산자(*)

주소 연산자(&)
주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환합니다.

'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불립니다.

참조 연산자(*)
참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환합니다.

 

C언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용됩니다.

이항 연산자로 사용하면 곱셈 연산으로 사용되며, 포인터의 선언 시나 메모리에 접근할 때도 사용됩니다.

 

 

문법 

타입* 포인터이름;  

타입* 포인터이름 = &변수이름;

또는

타입* 포인터이름 = 주소값;

 

 

포인터 연산
포인터는 값을 증가시키거나 감소시키는 등의 제한된 연산만을 할 수 있습니다.

C언어의 포인터 연산에는 다음과 같은 규칙이 있습니다.

1. 포인터끼리의 덧셈, 곱셈, 나눗셈은 아무런 의미가 없습니다.

2. 포인터끼리의 뺄셈은 두 포인터 사이의 상대적 거리를 나타냅니다.

3. 포인터에 정수를 더하거나 뺄 수는 있지만, 실수와의 연산은 허용하지 않습니다.

4. 포인터끼리 대입하거나 비교할 수 있습니다.

 

 

포인터 상수(constant pointer)란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미하며,
상수 포인터(pointer to constant)란 상수를 가르키는 포인터를 의미합니다.

 

 

1.코드(code) 영역

메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.

2.데이터(data) 영역

메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.

3.스택(stack) 영역

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.
이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 
데이터가 가장 먼저 인출됩니다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

4.힙(heap) 영역

메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

 

 

 

malloc() 함수

malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해줍니다.
malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받습니다.
이 함수는 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾습니다.
이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환합니다.
힙 영역에 할당할 수 있는 적당한 블록이 없을 때에는 널 포인터를 반환합니다.
주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야 합니다.
Comments