기본 문법
int nData{};
int *p{};
p = &nData; // p는 nData의 주소를 가리킨다.
*p = 100; // p가 가리키는 곳에 100을 대입한다.
printf("%d\n", nData); // 100 출력
쉽게 이해하기
아래의 예시처럼 바탕화면의 바로가기를 생각하면 포인터를 쉽게 이해할 수 있다.
int nData{}; // 실행 파일
int *p{}; // 바로가기 생성 (비어있음)
p = &nData; // 바로가기에 실행 파일 경로를 입력
*p = 100; // 바로가기를 통해 실행 파일 경로에 접근
printf("%d\n", nData); // 100 출력
배열을 가리키는 포인터
int arData[5]{ 5,4,3,2,1 };
int *p{};
p = arData;
p는 2가지 의미를 가진다.
1. int[5]를 가리킴.
2. arData[0]의 주소를 가리킴.
포인터 배열 변수 선언 시에 주의 사항
int*를 5개 가지는 배열을 선언한 것이다.
int *p[5]{}; // int *(p[5]){}; 우선순위 때문에 이것과 같다.
int[5]의 주소를 담을 수 있는 포인터 변수를 선언한 것이다.
int (*p)[5]{};
변수 선언 시에 상수가 들어가면 유연하게 쓰일 수 없기에 실제로 쓰지는 않는다.
int[5]를 가리키는 포인터라도 그냥 int 포인터를 선언해서 사용하자.
(배열의 크기를 상관 안해도 되기 때문이다. int[5] 포인터는 int[5]만 가리킬 수 있다.)
포인터 주소값에 상수값 더하기
int arData[5]{ 5,4,3,2,1 };
int p = &arData[0];
printf("%d\n", *p); // 5 출력
printf("%d\n", (*p + 1)); // 6 출력
// *p가 5이므로 5 + 1인 6 출력
printf("%d\n", *(p + 1)); // 4 출력
// p의 주소값에 1을 더하면, 자료형의 크기만큼 증가한다.
// int이므로 주소값이 4 증가하여 p[1]을 가리키기 때문에 4가 출력된다.
2차원 배열을 통한 예제
#include <iostream>
int main()
{
int arData[2][3]{ {6,5,4},{3,2,1} };
int(*p)[3]{};
p = &arData[0];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d\n", *(*(p + i) + j)); // p[i][j] 같음. (*(p + i))[j] 같음.
}
}
}
'기타 > C++' 카테고리의 다른 글
[C++] 네임스페이스 (0) | 2020.06.06 |
---|---|
[C++] 구조체 (0) | 2020.06.06 |
[C++] 함수와 배열 쓸 때 참고하기 (0) | 2020.06.06 |
[C++] 함수 쓸 때 참고하기 (0) | 2020.06.06 |
[C++] 배열 쓸 때 참고하기 (0) | 2020.05.08 |