C++

[강의] 9월 24일 수업정리

k-codestudy 2024. 9. 25. 02:56

오늘은 포인터에 대한 수업을 진행하였다.

 

포인터란?

포인터는 프로그래밍 언어에서 다른 변수의 메모리 주소를 가리키는 변수이다. 즉, 포인터는 특정 변수가 저장된 메모리의 위치(주소)를 가리키며, 이 주소를 통해 해당 변수의 값을 참조하거나 조작할 수 있다.

 

간단한 예로, 컴퓨터 바탕화면의 바로가기를 생각해 보자. 메모장을 실행할 때 메모장 바로가기를 사용하면, 바로가기는 실제 메모장의 위치를 가리키는 역할을 하게 된다. 여기서 메모장은 변수이고, 바로가기는 포인터에 해당된다.

 

 

포인터 사용 시 주의사항

  1. 널 포인터 체크는 중요하다
    널 포인터(NULL)는 포인터가 아무것도 가리키지 않음을 의미한다. 포인터가 유효한 주소를 가리키고 있는지 확인하지 않으면 프로그램이 잘못된 메모리에 접근할 수 있기 떄문이다.
  2. 포인터가 가리키는 데이터의 유효성은 보장되지 않는다
    포인터가 특정 메모리 주소를 가리키고 있어도 그 주소에 실제로 값이 존재할지는 보장되지 않는다. 가리키는 데이터의 유효성을 항상 확인해야 한다.
  3. 포인터로는 데이터의 유형을 알 수 없다
    포인터는 단순히 주소를 저장하는 변수이므로, 가리키는 데이터가 어떤 형식인지 직접 알 수 없다. 예를 들어 int* p;라는 선언은 p가 int형 데이터를 가리킬 것이라고 약속하지만, 실제로 가리키는 값은 프로그래머가 관리해야 합다.
  4. C++에서는 포인터와 변수가 서로 직접적으로 연결되어 있지 않다
    포인터는 변수가 저장된 주소만 알고 있으며, 그 변수가 어떤 변수인지 포인터 자체는 알 수 없다. 이를 관리하는 것은 프로그래머의 역할
  5. 포인터 전달은 Call by Value 방식이다
    포인터도 변수이기 때문에 함수에 전달될 때 값이 복사된다. 즉, 포인터 자체가 복사되어 전달되는 것이다. 다만, 복사된 포인터는 동일한 메모리 주소를 가리킨다.
  6. 포인터는 메모리 주소를 저장하는 독립적인 변수이다
    포인터 자체도 하나의 메모리 공간을 차지하며, 그 안에 저장된 값은 메모리 주소이다.

 

#include <iostream>

int main()
{
	int nData1{};

	int* p{};

	nData1 = 10;

	p = &nData1;

	printf("%d\n", nData1);
	printf("%p\n", &nData1);
	printf("%d\n", *p);
	printf("%p\n", p);
	printf("%p\n", &p);
}

 [ 주요 연산자 설명 ] 

  • & (주소 연산자): 변수 앞에 사용하여 해당 변수의 메모리 주소를 반환합니다.
  • * (참조 연산자): 포인터가 가리키는 주소의 값을 참조할 때 사용합니다.
  • % p: 메모리 주소를 출력할 때 사용하는 서식 지정자입니다.

[ 결과 값 ]

 

  1. nData1에 저장된 값
  2. nData1의 메모리 주소
  3. 포인터 p가 가리키는 값 (nData1에 저장된 값)
  4. 포인터 p의 값 (즉, nData1의 주소)
  5. 포인터 변수 p 자체의 메모리 주소

 

 

문제: int형 숫자 3개를 입력받아 가장 작은 수를 포인터로 가리키고 출력하라.

#include <iostream>

int main()
{
	int n1{};
	int n2{};
	int n3{};

	int* pMin{};

	scanf_s("%d", &n1);
	scanf_s("%d", &n2);
	scanf_s("%d", &n3);

	pMin = &n1;

	if (*pMin > n2)
		pMin = &n2;

	if (*pMin > n3)
		pMin = &n3;

	printf("%d\n", *pMin);
}
  1. int형 변수 n1, n2, n3와 int형 포인터 *pMin을 선언 ( pMin은 가장 작은 수의 주소를 저장할 포인터 )
  2. scanf_s 함수로 n1, n2, n3의 값을 입력받아 각각 변수 저장
  3. 포인터 pMin에 n1의 주소값을 저장 ( 초기에는 n1이 가장 작은 값일 가능성이 있다고 가정 )
  4. pMin이 가리키는 값과 n2의 값을 비교, 만약 pMin이 가리키는 값이 n2보다 크면, pMin에 n2의 주소값을 저장하여, 더 작은 값을 가리키도록 업데이트한다.
  5. 다시 한 번 pMin이 가리키는 값과 n3의 값을 비교한다. 이번에도 더 작은 값이 있으면 pMin에 n3의 주소값을 저장한다.
  6. 최종적으로 pMin이 가리키는 값, 즉 가장 작은 값을 출력한다.

 

 

 

'C++' 카테고리의 다른 글

[강의] 9월 26일 수업정리  (1) 2024.09.27
[강의] 9월 25일 수업정리  (1) 2024.09.26
[강의] 9월 13일 수업정리  (0) 2024.09.14
[강의] 9월 12일 수업정리  (0) 2024.09.12
[강의] 9월 11일 수업정리  (0) 2024.09.11