본문 바로가기
Game/C

포인터 개념 1

by sseddi 2020. 5. 2.
728x90

직접 주소 지정 방식 : 메모리를 사용할 때 프로그래머가 사용할 메모리 주소를 직접 적는 방식

ex) 102 번지에 1042라는 값을 2바이트 크기로 저장해라

 

-> 변수 사용시 직접 주소 지정 방식 사용(C언어의 직접 주소 지정 방식은 변수 개념을 사용)

 

직접 주소 지정 방식의 한계 

직접 주소 지정 방식의 한계는 함수 안에 선언한 변수는 해당 함수에서만 사용할 수 있고, 다른 함수에 선언한 변수가 메모리에 존재해도 문법적으로 접근할 수 없다는 것이다.

(다른 함수에서 선언한 변수를 사용하면 오류가 난다.)

 

하지만 함수의 매개변수와 반환값을 이용하면 약간의 절차를 걸쳐 서로 다른 함수에 존재하는 지역 변수들 간에 값을 주고받을 수는 있다.

 

 

간접 주소 지정 방식 : 주소를 간접적으로 명시하는 방식

주소를 직접적으로 명시하지 않고 중간에 매개체를 사용해 간접적으로 명시한다.

이는 진행에 다양성을 추구할 수 있다.

ex) 102번지에 4바이트 크기의 '주소'가 저장되어 있는데, 이 주소에 가서 '값' 1042를 2바이트 크기로 대입해라

 

주소에 108번지가 적혀있었다면 1042값은 108번지에 2바이트 크기로 저장될 것이다.

중간 매개체로 인해 명령을 할 때 실제 메모리 주소를 적지 않아도 된다.(실제 메모리 주소가 적힌 주소를 적으면 된다.)

 

또한, 실제 메모리 주소를 다르게 저장해야할 때도 명령을 변경하지 않아도 된다.(실제 메모리 주소가 적힌 곳의 주소만 변경하면 되니까)

 

명령을 바꾸는 것은 코드를 다시 번역하고 실행파일을 만들어야 하지만 주소를 변경하는 것은 단순한 데이터 조작으로 프로그램이 실행되는 중에도 변경할 수 있다.-> 프로그래머 입장에선 더 복잡해도 간접 주소 지정 방식이 좋다.

 

 

포인터 (*)

[자료형]*[포인터 변수 이름]

 

간접 주소 지정 방식으로 동작하는 특별한 변수를 선언하기 위한 문법

메모리 주소만을 저장하기 위한 변수 -> 일반 변수와 달리 *기호를 추가로 사용해 선언

 

포인터 변수는 자료형을 선언하지 않아도 무조건 크기가 4바이트(32비트 운연체제 기준, 주소 크기가 4바이트)로 정해져 있기 때문에 포인터 변수의 크기를 적을 필요가 없다.

근데 자료형은 왜 쓸까..??!

 

여기서 포인터 변수는 앞서 간접 주소 지정 방식에 나왔던 중간 매개체와 같다.

중간 매개체의 크기가 4바이트로 고정되어 있는 것이고, 작성된 자료형은 포인터 변수에 저장된 주소에 저장될 값의 자료형!!( =저장하기 원하는 값의 자료형 ) 그래서 자료형을 쓴다!

 

프로그램은 실행될 때마다 사용할 메모리 공간의 주소가 달라진다.

그래서 프로그램에 선언된 변수의 주소는 프로그램이 실행될 때마다 다른 주소에 할당된다.

그래서 주소를 직접 입력하기보다 프로그램 안에 선언한 다른 변수의 주소를 받아와 사용하는 것이 안전하다.

변수의 주소는 변수 앞 '& 연산자'를 사용해 구한다. -> ex) scanf 사용할 때 사용

 

 

<<포인터 예시>>

 

short birthday;  //2바이트 변수 birthday 선언

 

short *ptr;  //포인터가 가르키는 대상의 크기가 2바이트인 포인터 변수 ptr 선언

포인터 변수 선언하기 위해 * 사용

 

ptr=&birthday;  //birthday 변수의 주소를 ptr변수에 대입

 

*ptr=1042;  //ptr에 저장된 주소에 가서 값 1042를 대입

ptr포인터가 가르키는 대상에 가서 값을 대입하기 위해 * 사용 [번지 지정 연산자]

 

short *ptr; ptr=&birthday; 두 줄을 합쳐서 short *ptr=&birthday;라고 적을수도 있음.

 

 

(1)'ptr='(2)'*ptr='의 차이점

 

(1)포인터 변수의 값(가리키는 대상의 주소)이 변경 [번지 지정]

(2)포인터가 가리키는 대상의 값이 변경

 

(1) 형태는 포인터 변수에 주소를 저장

포인터 변수는 주소를 저장하기 때문에 메모리 크기가 4바이트로 고정

저장된 주소는 포인터가 가리키는 대상 메모리의 시작주소를 의미

 

(2) 형태는 포인터가 가리키는 대상에 값을 저장

여기서 *은 번지 지정 연산자 

 

 

포인터 사용 이유

포인터는 메모리 주소만을 다루기 위해 만든 문법이다.

포인터를 사용하면 간결하고 효율적인 표현과 처리가 가능하고 더 빠른 기계어 코드를 생성할 수 있으며복잡한 자료 구조(배열구조체 등)와 함수의 쉬운 접근이 가능하다

 

그 외에 이유로는 다음과 같다.

 

-메모리 주소를 참조해서 다양한 자료형 변수들의 접근과 조작 용이

-메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이

-한 함수에서 다른 함수로 배열이나 문자열을 편리하게 보낼 수 있음

-복잡한 자료구조를 효율적으로 처리

-배열로 생성할 수 없는 데이터를 생성

-메모리 공간을 효율적 사용

 

게임을 개발할 때, 플레이어를 이동시킬 때 좌표를 저장하고 효율적으로 이동하기 위해 포인터를 사용한다.

 

다음엔 매개변수, 포인터와 배열의 사용, 2차원 포인터에 대해 더 공부하려고 한다.

 

 

 

 

 

참고) 

http://www.yes24.com/Product/Goods/35094862

 

Do it! C 언어 입문

‘왜’ 쓰는지 모르면 의미 없다! 두 번 삽질하지 않게 도와주는 입문서!실무 20년 강의 10년, 현업 프로그래머가 원리부터 알려준다!결과만 알고 쓰는 사람은 원리를 알고 쓰는 사람을 절대 따라잡을 수 없다. C 언어를 처음 시작하는 출발선은 같지만 C 언어 문법 하나하나가 왜 만들어졌는지 원리를 이해하고 코딩하면 다르다. 프로그래머 취업 면접에...

www.yes24.com

https://oper6210.tistory.com/160

 

포인터 사용이유

함수 호출시 메모리를 통으로 복사해서 사용하면 너무 느리니깐요. 메모리 위치만 주고 받으면 빠르죠. 포인터란 자료가 저장되는 기억장치의 기억주소를 가리키는 지시자로써 포인터는 다른 �

oper6210.tistory.com

 

728x90

'Game > C' 카테고리의 다른 글

구조체 개념1  (0) 2020.06.06

댓글