포인터란 '가리키는 것'이란 의미를 지닌다.
프로그램 작동 시 컴퓨터는 각 방의 데이터가 필요해 방들마다 주소를 붙여 데이터를 꺼내기 쉽게 만들었다.
방의 주소를 얻는 방법이 '포인터'이다.
int
, char
변수처럼 포인터도 변수다.
포인터 변수는 특정한 데이터가 저장된 주소값을 보관하는 변수다.
포인터는 int
, char
처럼 형(type)이 있다.
이 말은 포인터가 메모리 상의 int
형 데이터의 주소값을 저장하는 포인터와 char
형 데이터의 주소값을 저장하는 포인터가 서로 다르다는 말이다.
int *p;
char *p;
포인터는 주소를 보관하는 변수다. 그럼 주소는 어떻게 알아내는 걸까?
'&' 연산자를 사용하면 주소값을 구할 수 있다.
/* & 연산자 */
#include <stdio.h>
int main() {
int a;
a = 2;
printf("%p \n", &a);
return 0;
}
포인터 'p'에 들어 있는 값과 변수 'a'가 저장된 주소값이 같다.
#include <stdio.h>
int main() {
int *p;
int a;
p = &a; // 변수 a의 주소값을 저장한다.
printf("포인터 p 에 들어 있는 값 : %p \n", p);
printf("int 변수 a 가 저장된 주소 : %p \n", &a);
return 0;
}
포인터 변수와 정수형 변수의 값이 같다.
/* * 연산자의 이용 */
#include <stdio.h>
int main() {
int *p;
int a;
p = &a;
a = 2;
printf("a 의 값 : %d \n", a); // 2
printf("*p 의 값 : %d \n", *p); // 2
return 0;
}
포인터 변수에 a
의 주소값을 저장한다.
*p
는 포인터에 저장된 주소(변수 a의 주소)에 해당하는 데이터(변수 a)를 의미한다.
따라서 *p = 3
은 a = 3
과 같은 의미다.
#include <sdtio.h>
int main()
{
int *p;
int a;
p = &a;
*p = 3;
printf("a의 값 : %d \n", a); // 3
printf("*p의 값 : %d \n", *p); // 3
return 0;
}
변수 a
와 포인터 p
의 메모리 상의 모습은 아래와 같다.
포인터 p
에 변수 a
의 주소값이 저장되어 있다면 포인터 p
는 변수 a
를 가리킨다 라고 말한다. 포인터는 변수여서 특정한 메모리 공간을 차지한다. 따라서 위 그림처럼 포인터도 자기 자신만의 주소를 가진다.
int a;
pointer *p;
p = &a;
*p = 4;
위 코드를 컴퓨터는 아래와 같이 해석한다.
int a;
// int 형 변수 a
선언, 메모리에 4 바이트 공간 생성
pointer *p
// pointer 형 변수 p
선언, 메모리에 8 바이트 공간 생성
p = &a
// 포인터 변수에 a
의 주소값을 저장한다.
*p = 4;
// 현재 포인터 p
는 변수 a
의 주소값이 들어있다. 그런데 a
의 주소값은 모든 주소가 아니라 "시작주소"만 들어있다. *p
는 포인터 변수에 저장된 주소값의 데이터를 가져온다. 하지만 포인터 타입이 명확하지 않아 시작주소부터 얼마만큼을 읽어들어야 할지 알 수 없다.
int a;
int *p;
p = &a;
*p = 4;
컴퓨터는 포인터가 int *
형인 것을 보고 '이 포인터는 int
데이터를 가리킨다'고 인식해 시작주소부터 4 바이트를 읽어 값을 바꾼다.
#include <stdio.h>
int main()
{
int *p;
int a;
int b;
p = &a;
*p = 2;
p = &b;
*p = 4;
printf("p에 저장된 값 : %p\n", p); // p에 저장된 값 : 0x7fffd3c4cb1c
printf("a의 주소값 : %p \n", &a); // a의 주소값 : 0x7fffd3c4cb18
printf("b의 주소값 : %p \n", &b); // b의 주소값 : 0x7fffd3c4cb1c
printf("-------------------\n");
printf("포인터 변수 p의 값 : %d\n", *p); // 포인터 변수 p의 값 : 4
printf("변수 a의 값 : %d\n", a); // 변수 a의 값 : 2
printf("변수 b의 값 : %d\n", b); // 변수 b의 값 : 4
}
포인터는 변수여서 가리키는 주소값이 변한다.
본 글은 이재범님의 모두의 코드 강좌를 정리합니다.
https://modoocode.com/23