본문 바로가기
개발 Tools/C_개념

C 포인터가 뭐길래

by 전컴반 2022. 6. 24.
반응형
포인터 ( Pointer )

 

하도 포인터 포인터 해서 다들 알고 있을 것이다.

맞다. 그냥 주소다. 주소를 가리키고 바로 그 주소로 접근하기 위해 사용한다. 

 

변수는 메모리를 할당받는다. 이때 메모리는 주소와 값으로 나눠져 있다고 생각한다.

+ 실제로는 코드 부분과 데이터 부분들이 나눠져 있다. 그래서 CPU는 코드를 통해 접근할 데이터의 주소를 얻은 다음에 그 주소를 참조하여 데이터에 접근한다. 

 

일단 먼저 느껴보자. 뭐든 느낌이 중요하다.

아, 그전에 포인터 변수의 선언은 " * "를 통해서 한다. 예를 들어 int *p;와같이 선언한다.

 

아래 코드를 보고 어떻게 되는지 보자.

 

#include <stdio.h> 

int main(void)
{
	int k = 8;
	int *p;
	p = &k; // 포인터의 초기화

	printf("k의 값 = %d\n", k);
	printf("k의 주소 = %d\n\n", &k);

	printf("p의 값 = %d\n", *p);
	printf("p의 주소 = %d\n", &p);
	printf("p의 주소 = %d\n", p);
	
	return 0;
}

 

변수 k를 선언하고 8을 집어넣고 변수 k의 주소를 포인터 변수 p로 받는다. 왜냐면 포인터는 주소를 받기 때문이다.

 

1. printf("k의 값 = %d\n", k);

- 우리가 흔히 알고 사용했던 변수 k가 가지고 있던 값을 나타낸다. (8)

 

2. printf("k의 값 = %d\n", &k);

- 변수 k의 주소를 나타낸다. (14022784)

 

3. printf("p의 값 = %d\n", *p);

- 주소의 내용물이다. 포인터의 값의 주소가 가리키는 값을 나타낸다. (8)

 

4. printf("p의 값 = %d\n", &p);

- 이놈이 포인터의 포인터다. 포인터도 변수기 때문에 주소를 가지고 있다. 그래서 쉽게 말해 포인터의 주소다. (14022772)

 

5. printf("p의 값 = %d\n", p); 

- 포인터 변수 p는 k의 주소를 가지고 있다고 했으니 k의 주소를 나타낸다. (14022784) 

 

그림으로 보면 더 이해가 빠를 것이다. 

 

 

추가적으로 포인터도 초기화를 해줘야 한다. *p = 100; 이런 식으로 사용하면 안 된다. NULL로 초기화하는 것이 좋다.

또한 변수의 타입도 맞춰야 한다. 내가 int의 주소 포인터를 생성하려면 int *p로 만들어야지 char *p와 같이 타입을 다르게 하면 안 된다.

 


 

" * "가 나타내는 의미에 대해 좀 더 알아보자

무슨 의미냐면 문자적으로는 "포인터가 가리키는 변수의 값을 반환한다"는 의미다.

 

예를 들어 요로콤 있다면 *p에는 어떤 값이 들어있을까?

 

int k = 10;
int *p;
p = &k;
printf("%d", *p);

 

*p는 포인터가 가리키는 변수의 값이라 했으니 포인터는 변수 k를 가리키고 있고 k는 10을 가지고 있으니 10으로 바로 접근하는 것이다.

 

정리하면, 포인터의 역할은 주소로 바로 접근함으로 더 빠르게 값을 얻을 수 있고, 변경에 용이하다.

 

 

포인터와 배열

 

사실 포인터는 배열이다 (엄밀히 말하면 같진 않다). 배열의 이름은 배열의 시작 주소와 똑같다.

같은지 한번 보자

 

int main(void)
{
	char str[10] = "whatever";
	char *p;
	p = str;

	printf("str의 값 = %d\n", str);
	printf("p의 주소 = %d\n", p);
	printf("str[0]의 값 = %d\n", &str[0]);
	printf("str[1]의 값 = %d\n", &str[1]);
	printf("str[2]의 값 = %d\n", &str[2]);
}

동일한 값을 가리키고 있다.

이때 중요한 건 배열의 이름을 포인터 변수 p와 같다고 둔 것이고, 배열 하나하나의 요소들은 타입에 따라 크기가 달라지는데, char는 1byte의 크기를 가지기 때문에 1씩 증가한다. int라면 4씩 증가할 것이다.

 

배열의 첫 번째 요소가 배열의 이름과 똑같다. 

반응형

댓글