포인터(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 |