방구석 컴퓨터/C,C++ / / 2021. 1. 13. 18:03

포인터[C]

반응형

포인터(pointers)는 C 언어에 기본적이기 때문에 C는 이들에 대해 많은 지원을 제공하고 있다.

실제로 C 언어에서는 어떤 타입 T에 대해서 T의 포인터 타입이 존재한다. 그리고 포인터 타입의 실제 값은 메모리의 주소가 된다.


포인터 타입에서 사용되는 두 가지 중요한 연사자는 2개가 있다

- & : 주소 연산자

- * : 역참조(간접 지시) 연산자

사용되는 예를 살펴보면

int i, *pi;    // i는 정수 변수이고, pi는 정수에 대한 포인터

pi = &i;   // &i는 i의 주소를 돌려주어 그 값을 pi의 값으로 지정

i = 10;   // i에 값을 저장하는 방법
*pi = 10;   // i에 값을 저장하는 또 다른 방법

위에 있는 예시중 마지막 2줄의 경우 모두 변수 i의 값으로 10 이 저장된다.

이 중 두 번째 경우 pi 앞에 있는 *는 이 포인터에 10을 저장하는 것이 아니라, 포인터 pi가 가리키는 장소에 10을 저장하는 역참조를 나타낸다.


포인터에 수행할 수 있는 또 다른 연산들도 존재한다.

우선 한 포인터가 다른 포인터 변수를 가리키도록 설정할 수 있다.

또, 포인터는 단순히 음이 아닌 정수 값을 가지므로 C 에서는 포인터에 대한 사칙연산, 즉 덧셈, 뺄셈, 곱셈, 나눗셈이 가능하다. 또한 포인터들의 크기를 비교할 수 있으며 포인터 값을 정수 값으로 바꿀 수도 있다.

#include <stdio.h>

void main(void) {
	int a = 1;
	int b = 2;
	int *p1 = &a;
	int *p2 = &b;
	
	printf("%d",*p1+*p2);
}

컴퓨터마다 포인터가 다르고, 어떤 경우에는 한 컴퓨터 내에서도 포인터 크기가 다르다. 예를 들면 char에 대한 포인터 변수의 크기가 float에 대한 포인터 변수의 크기보다 크다.


C 에는 널 포인터(null pointer)를 다루기 위한 특수한 값이 있는데, 널 포인터는 어떤 객체나 함수도 가리키지 않는다. 통상적으로 널 포인터는 정수 0의 값으로 표현된다. 널 포인터는 관계 연산에 사용할 수 있으며, 이때는 거짓(false)으로 해석된다. 사용 예시는 아래와 같다.

if (pi == NULL)
if (!pi)

 

반응형

'방구석 컴퓨터 > C,C++' 카테고리의 다른 글

포인터의 위험성💀  (0) 2021.01.14
동적 메모리 할당[C]  (0) 2021.01.13
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유