개발 지식/C,C++

[C언어] 포인터 사용 법

Prcnsi 2021. 6. 18. 00:20
728x90

안녕하세요. 저는 어제 종강을 했답니다~~~~(룰루)

그래서 포인터와 리눅스를 빠른 시일 내에 정리하고
VR, AR과 보안에 대해 공부하려 합니다.
이번 시간에는 포인터의 기본 개념에 대해 배워봅시다.


1. 개념

포인터는 변수의 주소를 담는 "변수"입니다. 포인터 변수 또한 변수이기 때문에 자료형이 있습니다.
int형 포인터 char형 포인터 등등과 같이 말이죠.

그러니까 물리적인 장치 메모리는 구분구적법처럼 잘게 쪼갠다는 느낌으로
메모리는 영역이 잘게 나누어져 있는데 이 나누어진 구역마다 주소가 있습니다.
(보통 16진수 표기)
그 주소를 "가리키는 게" 포인터 변수입니다.

변수를 왜 가리키는 것일까요? 물론 필요할 때 찾아 쓰기 위해 원하는 구역에 직접적으로 접근하기 위해서입니다.
따라서 이 변수에 역참조 연산자(*)를 이용하면 이 주소에 있는 값을 사용할 수 있습니다.

그러니까 포인터에서는 변수의 주소와 그 값을 구분해서 생각해야 한다는 것이죠.
예를 들어 아래와 같이 변수 a를 선언하고 이 변수의 주소를 출력해 보겠습니다.

포인터 변수

이를 실행하면 위와 같이 변수의 주소가 나옵니다.
위 코드의 구조는 아래와 같습니다.

a=3;

이때 변수의 주소는 006FF910이고 변수의 값은 3입니다. 무슨 말인지 이해 가시나요?




2. 문법

먼저 아래 세 가지에 대해 이해해야 합니다.

  • &(앰퍼샌드)
  • *(애스터리스크)
  • 형식 지정자

1) 앰퍼샌드(&)

자 먼저 앰퍼샌드 기호는 변수의 주소를 반환한다.

이는 scanf사용 시에 변수의 앞에 붙이는 것으로 접해 보셨을 텐데요.
이때와 마찬가지로 변수가 배열일 때에는 앰퍼샌드를 붙이지 않습니다.

따라서 주소를 저장하는 포인터 변수에 &변수로 주소를 저장할 수 있다.

2) 애스터리스크(*)

다음으로 *기호는 두 가지의 의미가 있습니다. 하나는 포인터를 선언한다는 의미의 *이고
다른 하나는 주소의 값에 직접 접근하는 의미의 *입니다.

(1) 포인터 선언 시

아래와 같이 포인터 변수를 "선언"할 때 사용합니다.

자료형 *변수명=값;

(2) 포인터의 값에 접근(역참조 연산자)

다음으로는 포인터 값에 접근할 때 사용합니다.
그냥 이것은 선언할 때가 아닌데 변수명 앞에 *를 붙이면 역참조라고 생각하면 됩니다.

3) 형식 지정자

형식 지정자는 물론 출력할 때 사용하는 것이다.
따라서 아래와 같이 정리할 수 있다.

%(해당 자료형) *로 시작
%p &로 시작

(이때 &로 시작할 때는 %p를 사용하면 된다고 했는데 위는 16진수로 출력하는 것이고
8진수 %o로도 출력할 수도 있다)

3. 사용 방법

이의 기본은 4 Step으로 설명할 수 있다.

1. 기본 변수 선언
2. 포인터 변수 선언
3. 포인터 변수에 기본 변수의 주소 담기
4.*포인터 변수로 기본 변수의 값 접근

아래는 그 예이다. 여기서 빨간 네모 친 *가 역참조 연산자로 사용된 것이다.

포인터 예제



감사합니다

728x90