C++ 포인터에 대한 이해를 얼마나 하고 있는지 복습하는 예제다.
포인터형 변수는 16진수로 표기된다.
cout << " x = " << x << ", x 주소 : " << (uintptr_t)&x << endl;
포인터 주소를 10진수로 출력되도록 하려면 uintptr_t 로 형변환을 하면 된다.
- 포인터는 변수다. - C언어 및 C++ 언어에서는 주소도 데이터다. - 포인터 변수는 메모리 번지를 저장한다. - 자신의 자료형과 같은 주소를 값으로 갖는다. - 포인터의 크기는 자료형에 상관없이 4bytes이다.
|
int a = 100; // 변수의 선언, 자료형 변수 = 값;
int* ptr; // 포인터의 선언
ptr = &a; // 주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환
주소 연산자(&)
주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.
'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 주소 연산자 또는 번지 연산자 라고 불린다.
역참조 연산자(*)
역참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터가 가리키는 주소에 저장된 값을 반환한다.
포인터 선언
int* ptr; // 올바른 예
int* ptr1, ptr2; // 잘못된 예
int *ptr1, *ptr2; // 올바른 예
두개 이상의 int형 포인터를 선언하고 싶을 때에는 각각의 포인터 변수 이름 앞에 역참조 연산자(*)를 따로 사용하여 선언해야 한다.
int a = 7; // 변수의 선언
int* ptr = &a; // 포인터의 선언 및 주소 할당
// 자료형 변수 = 값;
// 자료형 : int*, 변수 : ptr, 값:&a
// ptr도 변수이므로 &ptr 즉 주소를 갖는다.
int **pptr = &ptr; // 더블 포인터 : 포인터의 포인터
예제1
#include <iostream> using namespace std;
int main() { // 주소 연산자(&) : 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다. // 역참조 연산자(*) : 포인터의 이름이나 주소 앞에 사용하여, 포인터가 가리키는 주소에 저장된 값을 반환한다.
int a = 10, b = 20, c = 30; cout << endl << " a = " << a << ", b = " << b << ", c = " << c << endl;
int* p = &a; // 포인터 선언 및 a 변수의 주소 할당 cout << endl << " *p = " << *p << " // 포인터 p → a " << endl; cout << " a = " << a << endl;
int &r = b; // 참조변수 선언 및 b 변수 할당 cout << endl << " r = " << r << " // reference r → b" << endl; cout << " b = " << b << endl;
int** pp = &p; // 더블 포인터 : p 포인터의 포인터 cout << endl << " **pp = " << **pp << " // 포인터 p → a " << endl; cout << " a = " << a << endl;
int* (&rp) = p; // p 포인터에 reference 변수 rb 선언 cout << endl << " *rp = " << *rp << " // reference rp → p, 포인터 p → a " << endl; cout << " a = " << a << endl;
r = c / *p; cout << endl << " r = " << r << " // reference r → b " << endl; cout << " b = " << b << endl;
rp = &c; // rp 즉 p 포인터 변수에 c변수 주소 할당 cout << endl << " *rp = " << *rp << " // reference rp → p → c " << endl; cout << " c = " << c << endl;
**pp = 40; cout << endl << " **pp = " << **pp << " // 포인터 p → c " << endl; cout << " c = " << c << endl;
*p = 50; cout << endl << " *p = " << *p << " // 포인터 p → c " << endl; cout << " c = " << c << endl;
*pp = &a; cout << endl << " **pp = " << **pp << " // 포인터 p → a " << endl; cout << " a = " << a << endl;
*rp = 60; cout << endl << " *rp = " << *rp << " // reference rp → p, 포인터 p → a " << endl; cout << " a = " << a << endl;
cout << endl << "***** 결과 출력 *****" << endl; cout << " a = " << a << endl; cout << " b = " << b << endl; cout << " c = " << c << endl; cout << " *p = " << *p << endl; cout << " r = " << r << endl; cout << " **pp = " << **pp << endl; cout << " *rp = " << *rp << endl; }
|
실행결과
참고하면 좋은 자료
C언어 포인터 인강 ② 포인터 때문에 미쳐 버릴 것 같은 당신께 https://www.youtube.com/watch?v=LtmJm068muw&t=31s