C++ 포인터

진경천·2023년 9월 12일
0

C++

목록 보기
17/90

포인터의 기본

자료형* 변수 의 형태를 띄며 메몰리 주소를 저장하고 있는 변수이다.
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

profile
어중이떠중이

0개의 댓글