IT 프로그래밍/자료구조

포인터에 관한 기본적인 개념 설명 및 예제

기술1 2024. 9. 2. 14:12
반응형

포인터는 메모리 주소를 값으로 가지는 변수입니다. 

int * ptr;

이런 식으로 구성이 되어 있습니다.

 

예제1

#include <iostream>
using namespace std;

int main() {
	cout << sizeof(int) << " " << sizeof(int*) << endl;
	cout << sizeof(char) << " " << sizeof(char *) << endl;
	cout << sizeof(double) << " " << sizeof(double *) << endl;

	int c = 12;
	int* p;
	p = &c;

	cout << p << endl;
	cout << *p << endl;

	return 0;
}

해당 코드는 sizeof를 판별하는 코드입니다. 포인터에 대한 개념을 개관적인 코드를 통해 이해할 수 있습니다. 

 

예제2

#include <iostream>
using namespace std;

int main() {
	int* pt1, *pt2;
	int x = 3, y = 2;

	pt1 = &x;
	pt2 = pt1;

	y = *pt2;
}

포인터의 개념을 다루고 있습니다. int *pt1, *pt2; 두 개의 정수형 포인터를 선언하며 이 포인터들은 정수형 변수의 주소를 저장할 수 있습니다. 

 

int x =3, y= 2; 두 개의 정수형 변수를 선언하고 각각 3, 2로 초기화합니다. 포인터간의 치환은 다른 연산의 치환과 동일한 과정입니다. 

 

pt2 = pt1 같은 경우에도 pt1에 보관되어 있는 것을 pt2에 쓰라는 것입니다. pt2도 pt1과 똑같은 값을 가지게 되는 것입니다. 그러므로 동일한 메모리의 주소를 가리키게 되는 것입니다. 

 

예제3

#include <iostream>
using namespace std;

int main() {
	int a = 1, b = 2;
	swap(&a, &b);
	cout << a << " " << b << endl;
}

void swap(int* x, int* y) {
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

포인터를 설명할 때 사용하는 대표적인 예제입니다. swap 함수를 만들어서 둘을 바꿔주는 역할을 하는 것인데요. a, b를 매개변수로 넘겨줄 때 &와 *를 넣지 않으면 안되는 이유를 설명하기 위한 코드입니다. 

 

&와 *를 넣어주지 않는다면 매개변수의 전달이 값에 의한 호출로 일어나기 때문에 a,b와 x,y라는 것에서 이 a,b와 x,y는 별개의 변수이기 때문에 swap을 하더라도 &와 *가 없다면 원래 가지고 있던 a, b는 바뀌지 않기 때문에 기능을 정상적으로 작동하지 않는 것입니다. 

 

예제4

int main() {
	Point2D p;
	p.x = 1, p.y = 2;

	Point2D* ptr_p = &p;
	(*ptr_p).x = 10;

	ptr_p->y = 20;

	cout << ptr_p->x << " " << ptr_p->y << endl;

	return 0;
}

구조체와 포인터를 사용하여 객체의 멤버 변수를 조직하는 방법을 보여줍니다. 예제에는 Point2D라는 구조체를 사용하고 있으며 구조체의 메버 변수 x와 y를 포인터를 통해 간접적으로 수정합니다. 

 

구조체 선언은 Point2D라는 구조체가 정의되어 있다고 가정합니다. 이후 구조체의 포인터 선언 및 초기화, 포인터를 통한 멤버 접근 및 수정을 합니다. 

 

*(ptr_p).x 대신 ptr_p -> x로 변경이 가능합니다. 

 

이것을 실행하면 10, 20이 나오게 됩니다. 

반응형