c, c++ 포인터
포인터란?
특정 메모리의 위치를 가리키도록 하는 변수를 포인터(pointer)라고 합니다. 즉 주소를 알아야 사용할 수 있습니다.
우리는 지금까지 변수를 선언하면 그 변수가 메모리에 기록된다고 생각하지 않고, 그 선언한 이름과 값만 생각을 하고 사용을 했습니다. 하지만 실제로 int a; 이라고 선언할 때 '메모리 x132453647(임의)에 int형, 변수 이름 a, 초기화되지 않은 상태로 사용한다'라고 하는 것과 같습니다. 이때 a = 10; 이라고 입력하면 '메모리 x132453647에 있는 값을 10으로 바꿔주는 것'과 같습니다.
그래서 우리가 포인터를 사용한다는 것은 '이름이 a'인 변수를 찾는 것이 아닌, '메모리 x132453647(임의)'를 찾으라는 것입니다. 주소도 알게 되면 당연히 값도 알 수 있을 겁니다.
포인터 선언!
포인터 또한 기존에 변수를 선언 하던 것과 매우 유사 하게 생겼습니다. 자료형 또한 int, float, double, lang, char 등 존재합니다. 변수와 동일하게 선언하되 중간에 * 만 넣어주시면 됩니다.
예를 들면
//int형 포인터
int *a;
//float형 포인터
float *a;
//double형 포인터
double *a;
위와 같이 선언할 수 있다.
포인터 선언과 초기화 어떻게 하면 선언과 함께 초기화를 할 수 있을까요? 우리가 "scanf"를 배울때 "&"이런 기호를 사용한 기억이 있나요? 바로 "&"이 기호가 주소를 알려주는 기호입니다.
예를 들면
#include <stdio.h>
int main() {
int num1 = 5;
int num2 = 10;
int *num1Ptr = &num1;
int *num2Ptr = &num2;
printf("%d %d\n", num1, *num1Ptr);
printf("%d %d\n", num1, num1Ptr);
}
/*
출력 : 5 5
10 10
*/
위와 같이 할 수 있다. 조금 설명하자면 int형 변수 num1, num2를 선언후 int형 포인터 num1Ptr, num2Ptr도 선언하여
int* num1Pointer = &num1;
int * num1Pointer = &num2;
를 입력해주니, 각각 num1과 num2의 주소를 받는 것을 확인할 수 있습니다. 그 결과 num1값과 *num1Ptr의 값이 동일하게 출력되는 것을 확인할 수 있습니다.
주의!
인트형 포인터 int* p 를 선언했을 때 p = &num1 int형 포인터인 변수 p의 값에 num1변수 값을 대입했을때,
printf("%d", *p) 와 같은 식으로 p에 *을 붙여서 사용하면 p가 가리키는 주소에 있는 값을 나타내고
printf("%d", p)와 같이 p만 사용하면 p가 가리키고 있는 주소를 나타냅니다.
'알고리즘 > C, C++' 카테고리의 다른 글
백준 11047번 동전 0 (0) | 2021.06.20 |
---|---|
백준 7569 토마토 (0) | 2021.06.16 |