자료형* 변수 의 형태를 띄며 메몰리 주소를 저장하고 있는 변수이다.
ex)
위 처럼 포인터는 값을 저장하고 있는 변수의 주소값을 저장한다.
#include <iostream>
using namespace std;
int main() {
int n = 123;
int* p0 = &n;
int* p1 = p0;
cout << "p0 = " << p0 << endl;
cout << "p1 = " << p1 << endl;
cout << "&n = " << &n << endl;
cout << endl;
cout << "*p0 = " << *p0 << endl;
cout << "n = " << n << endl;
cout << endl;
n = 300;
// n의 값을 바꾸면 포인터의 값도 바뀐다.
cout << "n = " << n << endl;
cout << "*p0 = " << *p0 << endl;
cout << "*p1 = " << *p1 << endl;
/*
int* pointer = 0;
cout << *pointer << endl;
위와 같은 포현은 문제를 일으킬 수 도 있음.
*/
cout << endl;
int num0 = 10;
const int* pnum0 = &num0;
int* const pnum1 = &num0;
cout << "*pnum0 = " << *pnum0 << endl;
cout << "*pnum1 = " << *pnum1 << endl;
int num1 = 20;
pnum0 = &num1;
// 상수이지만 주소는 변경하는 것이 가능하다. 하지만 주소가 가리키는 값은 변경 못한다.
*pnum1 = num1;
// 주소값이 상수이기 때문에 가리키는 값 변경이 가능하다.
cout << "*pnum0 = " << *pnum0 << endl;
cout << "*pnum1 = " << *pnum1 << endl;
return 0;
}
p0 = 00000055893AF4F4
p1 = 00000055893AF4F4
&n = 00000055893AF4F4
*p0 = 123
n = 123
n = 300
*p0 = 300
*p1 = 300
*pnum0 = 10
*pnum1 = 10
*pnum0 = 20
*pnum1 = 20
배열 또한 포인터로 볼 수 있으며 또한 포인터로 배열을 표현할 수 있다.
#include <iostream>
using namespace std;
int main() {
int nums[] = { 1, 2, 3 };
int* pNums = nums;
cout << nums << endl;
cout << &nums << endl;
cout << &nums[0] << endl;
// 배열의 이름은 배열의 첫번째 주소를 의미하므로 nums와 &nums[0]는 같다.
cout << endl;
cout << typeid(1).name() << endl;
cout << typeid(nums).name() << endl;
cout << typeid(&nums).name() << endl;
cout << typeid(&nums[0]).name() << endl;
// nums와 &nums[0]는 integer pointer type
// &nums 는 int가 3개인 배열의 포인터
cout << endl;
cout << pNums << endl;
cout << pNums + 1 << endl;
cout << pNums + 2 << endl;
// 1이 더해질 수록 주소가 4바이트만큼 올라감
cout << endl;
for (int i = 0; i < 3; i++)
cout << i + 1 << "th " << *(pNums + i) << endl;
// *(p + n) == p[n] 포인터를 배열처럼 사용가능
return 0;
}
00000043FD0FF878
00000043FD0FF878
00000043FD0FF878
int
int [3]
int (* __ptr64)[3]
int * __ptr64
00000043FD0FF878
00000043FD0FF87C
00000043FD0FF880
1th 1
2th 2
3th 3
문자열 또한 문자의 배열이므로 비슷한 관계를 나타낸다
#include <iostream>
using namespace std;
int main() {
char str0[] = "abcd";
char* str1 = str0;
const char* str2 = "hello";
// 문자열을 저장 할 때는 const를 붙여 상수로 정해야함. 변환 방지
cout << str0 << endl;
cout << str1 << endl;
cout << str2 << endl;
cout << *str0 << endl;
// *(str0 + 0)과 같으므로 문자열 배열의 첫번째 원소가 출력됨.
return 0;
}
abcd
abcd
hello
a