포인터 ( 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씩 증가할 것이다.
배열의 첫 번째 요소가 배열의 이름과 똑같다.
'개발 Tools > C_개념' 카테고리의 다른 글
C Malloc 0으로 초기화 ( Calloc ) (0) | 2022.10.26 |
---|---|
C 배열의 모든 것이었으면 좋겠다 ( 문자열, gets, puts, 2차원 배열, Call by value, Call by reference ) (0) | 2022.06.18 |
C 기억 클래스 (storage class, auto, static, extern, register) (0) | 2022.06.15 |
C 개념 1부터 n까지 합 구하기 (0) | 2022.01.12 |
C 개념 조건 연산자 ( ? : ) (0) | 2022.01.12 |
댓글