[C++]_S11-포인터_마무리

신치우·2025년 2월 16일

CPP

목록 보기
39/62

포인터는 주의해서 써야한다
특히 메모리와 관련하여 잘 고민하고 사용할것

#include <iostream>
using namespace std;

// 오늘의 주제 : 포인터 마무리

// 1) 포인터 vs 배열 2탄
// 2) 주의사항

int& TestRef()
{
	int a = 1;
	return a;
}

int* TestPointer()
{
	int a = 1;
	return &a;
}

void TestWrong(int* ptr)
{
	int a[100] = {};
	a[99] = 0xAAAAAAAA;
	*ptr = 0x12341234;
}

int main()
{
	// 주소를 담는 바구니
	// 진퉁은 저~ 멀리 어딘가에 
	// p는 단지 그곳으로 워프하는 포탈
	int* p;

	// 원조 데이터
	// 닭장처럼 데이터의 묶음 (엄청 많고 거대)
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8 };

	// 많은 사람들이 [배열 = 포인터] 라고 착각 하는 경향이 있음

	// - [배열의 이름]은 배열의 시작 주소값을 가리키는 TYPE* 포인터로 변환 가능!

	p = arr;

	// -[Type형 1차원 배열]과 [type*형 포인터]는 완전히 호환이 된다
	cout << p[0] << endl;
	cout << arr[0] << endl;
	cout << p[5] << endl;
	cout << arr[5] << endl;
	cout << *p << endl;
	cout << *arr << endl;
	cout << *(p + 3) << endl;
	cout << *(arr + 3) << endl;

	// [1][2][3][4] - 알아두면 좋을 내용
	int arr2[2][2] = { {1, 2}, { 3, 4} };

	// 주소2[] << 4바이트
	// 주소1[주소2]
	// pp [주소1]
	int** pp = (int**)arr2;

	// type name [개수]

	// [1][2] [3][4]
	// [주소]
	int(*p2)[2] = arr2;

	cout << (*p2)[0] << endl;
	cout << (*p2)[1] << endl;
	cout << (*(p2 + 1))[0] << endl;
	cout << (*(p2 + 1))[1] << endl;
	cout << p2[0][0] << endl;
	cout << p2[0][1] << endl;
	cout << p2[1][0] << endl;
	cout << p2[1][1] << endl;

	
	int* pointer = TestPointer(); // 지역변수의 메모리를 사용하고 있는데 에러가 발생하지 않음

	TestWrong(pointer);

	*pointer = 123; // 심지어 해당 메모리를 건드리고 있어도 문제가 생기지 않음

	return 0;
}
profile
https://shin8037.tistory.com/

0개의 댓글