[C] pointer

최현석·2022년 3월 9일
0

정보처리가시에 꼭 나오는 개념인 포인터 개념을 잡고자 공부해보았다.

주소값 개념을 자바할 때 이해하고 있었으나,

C언어에서는 작성자가 수동으로 제어할 수 있는게 재밌다.


주소값의 이해

컴퓨터 메모리 상에 저장되는 변수의 값이 저장되는 주소 값을 가리키는 것.

데이터의 주소값이란 해당 데이터가 저장된 메모리의 시작 주소를 의미한다.

C 언어에서는 이러한 주소값을 1바이트 크기의 메모리 공간으로 나누어 표현한다.

예를 들어, int 형 데이터는 4바이트의 크기를 가지지만, int형 데이터의 주소값은 시작 주소 1바이트만을 가리킨다.


pointer, 포인터

C 언어에서 포인터 (pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부른다.
char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다.

// 변수의 선언
int n = 100;

// 포인터의 선언
int *ptr = &n;

다음 그림은 위의 예제에서 사용된 변수와 포인터가 메모리에서 어떻게 저장되는지 보여준다.

포인터 연산자

  1. 주소 연산자 : &

  2. 참조 연산자 : *

1. 주소 연산자 (&), (번지연산자)

주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.
" & " 기호는 앰퍼샌드(ampersand) 라고 읽으며, 번지연산자라고도 불린다.

2. 참조연산자

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

C 언어에서 " * " 기호는 사용하는 위치에 따라 다양한 용도로 사용된다.
이항 연산자로 사용하면 곱셈 연산으로 사용되며, 포인터의 선언 시나 메모리에 접근할 때도 사용된다.

" * " 기호는 아스테릭이라고 읽는다.

포인터의 선언

C언어에서 포인터는 다음 문법에 따라 선언한다.

타입 *포인터이름;

타입이란 포인터가 가리키고자 하는 변수의 타입을 명시한다.
포인터 이름은 포인터가 선언된 후에 포인터에 접근하기 위해 사용된다.

포인터를 선언한 후 참조연산자(*) 를 사용하기 전에 포인터는 반드시 초기화가 선행되어야 한다.
그렇지 않으면 의도하지 않은 메모리의 값을 변경하기 때문이다.

C 컴파일러는 초기화하지 않은 포인터에 참조 연산자를 사용하면 오류를 발생시킨다.

따라서 다음과 같이 포인터의 선언과 동시에 초기화를 함께하는 것이 좋다.

타입 포인터이름 = &변수이름;
또는
타입
포인터이름 = 주소값;

포인터의 참조

C 언어에서 선언되는 포인터는 참조연산자(*) 를 사용하여 참조할 수 있다.

아래는 포인터의 주소값과 함꼐 포인터가 가리키고 있는 주소값의 데이터를 참조하는 예제다.

int x = 7;  // 변수의 선언
int *ptr = &x; // 포인터의 선언
int *pptr = &ptr; // 포인터의 포인터 주소값 참조

예시

포인터와 배열

배열도 주소로서 가리킬 수 있다.

int s[3] = {1,2,3}

인덱스 [0]이 기본 시작 주소, 인덱스 [1] 은 포인터+1 ...

예제


레퍼런스 : TCP school, pointer, 얄팍한코딩사전, 기술노트 알렉

profile
노력과 성장을 기록합니다.

0개의 댓글