정체불명의 모모

강의 내용 정리(Section_3/포인터, const, 참조 등) 본문

프로그래밍(c++)/인프런 강의 정리(C++)

강의 내용 정리(Section_3/포인터, const, 참조 등)

정체불명의 모모 2024. 5. 17. 13:44

강의 중 배운 내용과 추가적으로 배워야 할 부분들을 정리한 메모장 입니다.

강의 : (인프런) 게임 프로그래머 입문 올인원 


포인터 연산

: 포인터는 값을 증가시키거나 감소시키는 등의 제한된 연산만을 할 수 있습니다.

 

 포인터 변수에 대한 연산은 포인터 변수의 자료형과 연관이 있습니다.

 포인터 변수에 값을 더하거나 빼는 연산은 포인터 변수가 가리키고 있는 주소에 저장된 자료형의 크기 만큼 주소를 

 증감 시킵니다.

ptr + i 가 가리키는 주소 : ptr+(i바이트)가 아닌 ptr+(i*sizeof(*ptr)바이트)

 

포인터 변수에 대한 연산은 메모리에 저장된 자료를 포인터 변수로 처리하기 위해서 입니다.

그렇기 때문에 모든 연산자를 사용할 수 있는 것은 아니고, 현재 자료의 다음 또는 이전 자료를 처리하는 증감 연산만

가능 합니다.

산술 연산자 +, - , ++, --
주소 연산자 &, *
대입 연산자 =, += , -=
기타 연산자 sizeof
간접 연산자 *
간접 멤버 연산자
(구조체 포인터를 이용하여 멤버에 접근할 때 사용하는 연산자)
->

 

  C++의 포인터 연산의 규칙

1. 포인터끼리의 덧셈, 곱셈, 나눗셈은 아무런 의미가 없습니다.
2. 포인터끼리의 뺄셈은 두 포인터 사이의 상대적 거리를 나타냅니다.
3. 포인터에 정수를 더하거나 뺄 수 는 있지만, 실수와의 연산은 허용하지 않습니다.
4. 포인터끼리 대입하거나 비교 할 수 있습니다.

포인터와 배열의 관계

: 포인터와 배열은 매우 긴밀한 관계를 맺고 있으며, 어떤 부분에서는 서로를 대체할 수도 있습니다.

  배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같습니다.

 

   C++에서는 배열의 이름을 포인터처럼 사용 할 수 있을 뿐만 아니라, 포인터를 배열의 이름처럼 사용할 수도 있습니다.

   즉, C++에서는 배열의 이름이 주소로 해석되며, 해당 배열의 첫 번째 요소의 주소와 같게 됩니다.

 

int arr[3] = {10, 20, 30};	// 배열 선언
int* ptr = arr;             // 포인터에 배열의 이름을 대입함

cout << "배열의 이름을 이용하여 배열 요소에 접근 : " << arr[0] << "," << arr[1] << "," << arr[2] << endl;
cout << "포인터를 이용하여 배열 요소에 접근 : " << ptr[0] << "," << ptr[1] <<"," << ptr[2]<< endl;

cout << "배열의 이름을 이용한 배열의 크기 계산 : " << sizeof(arr) << endl;
cout << "포인터를 이용한 배열의 크기 계산 : " << sizeof(ptr) << endl;

 

예제 코드 결과 값

배열의 이름을 이용한 크기 계산에서는 배열의 크기가 int형 배열 요소 3개의 크기인 12바이트로 제대로 출력 됩니다.

하지만 포인터를 이용한 크기 계산에서는 배열의 크기가 아닌 포인터 변수 자체의 크기가 출력되는 차이가 있습니다.

 

예제속 배열의 크기 : 12바이트

포인터 변수의 크기 : 8바이트

 

배열의 포인터 연산

배열의 이름으로 포인터 연산을 진행하여 배열의 요소에 접근 합니다.

int arr[3] = {10, 20, 30};	// 배열 선언

cout << "배열의 이름을 이용하여 배열 요소에 접근 : " << arr[0] << "," << arr[1] << "," << arr[2] <<endl;
cout << "배열의 이름으로 포인터 연산을 해 배열 요소에 접근 : " << *(arr+0) <<"," << *(arr+1) <<"," <<*(arr+2);

 

예제 코드 결과


Const(상수화)

: Const는 대상을 변경하지 않는 '상수'를 의미 합니다. 이는 다른 프로그래밍 언어에서도 유의미하게 사용하며

  이를 통해 데이터의 보존성을 지킬 수 있습니다.

 

 

Q. const 변수들은 메모리에 어떻게 할당 될까??

:  const의 경우 딱히 메모리를 어떻게 해야 한다고 표준에 명시되어 있지 않지만, 대부분 read only data( .rodata )영역에 

   에 저장할 수도 있지만, 컴파일러가 모두 상수로 치환할 수도 있습니다.

   단, const 변수라도 함수 내부에 선언 한다면, 스택 영역에 정의 됨.(선언과 정의의 차이는 '메모리를 할당 했는가')


포인터와 참조의 차이 및 장 단점

 

▷ 포인터(pointer)

: 포인터는 메모리의 주소를 가지고 있는 변수 입니다.(주소 값을 통한 메모리 접근을 한다. / 간접 참)

 

▷ 레퍼런스(reference)

: 레퍼런스 = 참조자

  참조자는 자신이 참조하는 변수를 대신 할 수 있는 또 하나의 이름 입니다.

    즉, 변수에 별명(별칭)을 하나 붙여 주는 것 입니다.

   (변수 명을 통해서 메모리를 참조 한다. / 직접 참조)

 

포인터 레퍼런스의 가장 큰 차이점

: 포인터의 경우 포인터는 메모리가 저장되어 있는 곳을 가리키는 값을 저장 하지만, 레퍼런스의 경우 값(변수)에 대한

   별칭을 의미 하는데 있어 차이가 있습니다.

  포인터는 주소 값을 저장하기 위해 별도의 메모리 공간을 소모
레퍼런스는 같은 메모리 공간을 참조 하므로 메모리 공간을 소모하지 않습니다.

 

비교 포인터(Pointer) 레퍼런스(Reference)
정의 포인터는 메모리 값에 대한 주소값을
저장 합니다.
변수에 대한 별칭(Alias)을 의미
반환값 '*' 연산자에 의해 포인터에 저장된 주소에 어떠한
값이 저장되있는지 표현 합니다.
'&'값을 통해, 레퍼런스의 주소값을 반환
합니다.(변수의 주소값과 동일)
NULL 값 NULL 값 가능  NULL 값 불가능
초기화 실행 중 어떠한 때에도 초기화 가능 Ref 값이 생성될때, 초기화가 되어 있어야 합니다.
재할당 여부 재할당 가능 재할당 불가능

 

 

※ call by pointer / call by refrence

 

▷ call by pointer

:  매개 변수로 함수 인자 전달 시, 메모리 소모가 일어나고, 값 복사가 발생된다.

void SwapCallByPointer(int* pNum1, int* pNum2)
{
    int temp = *pNum1;
    
    *pNum1 = *pNum2;
    *pNum2 = temp;
 }

 

 ▷ call by reference

: 메모리 소모가 없고, 값 복사 또한 발생하지 않는다.

void SwapCallByReference(int& pNum1, int& pNum2)
{
    int temp = pNum1;
    
    pNum1 = pNum2;
    pNum2 = temp;
 }

 


참고 사이트 

https://sean.tistory.com/125

 

구조체(7) 구조체와 포인터 & 간접 멤버 연산자

구조체(7) 구조체에서 포인터가 사용되는 경우는 2가지이다. 1. 구조체를 가리키는 포인터 2. 포인터를 멤버로 가지는 구초제 일단 먼저 구조체를 가리키는 포인터를 알아보자 ※ 구조체를 가리

sean.tistory.com

https://www.tcpschool.com/cpp/cpp_arrayPointer_pointerCalculation

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

https://mndd.tistory.com/137

 

C++ 포인터 연산

포인터 변수에 대한 연산은 포인터 변수의 자료형과 연관이 있습니다. 포인터 변수에 값을 더하거나 빼는 연산은 포인터 변수가 가리키고 있는 주소에 저장된 자료형의 크기만큼 주소를 증감시

mndd.tistory.com

https://velog.io/@mangojoa/C-C%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EA%B0%9C%EB%85%90-8%ED%83%84-const-%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

 

[C++] C에서 사용되는 개념 8탄 (const 와 메모리 구조)

상수화의 개념그 대상을 변경하지 않는 "상수"를 의미합니다. 이는 다른 프로그레밍 언어에서도 유의미하게 사용하며 이를 통해 데이터를 보존성을 지킬 수 있습니다.코드를 작성하다보면 값이

velog.io

https://ssinyoung.tistory.com/16

 

12. [C / C++] 포인터와 레퍼런스의 차이

1. 포인터 (pointer) 포인터는 메모리의 주소를 가지고 있는 변수이다. 주소 값을 통한 메모리 접근을 한다. (간접 참조) 2. 레퍼런스 (reference) 레퍼런스 = 참조자. ( C++ 문법 ) 참조자는 자신이 참조하

ssinyoung.tistory.com

https://guru.tistory.com/136#%ED%8F%AC%EC%9D%B8%ED%84%B0-%ED%99%9C%EC%9A%A9

 

[C++] Reference 와 Pointer 의 차이점 설명해줄래

안녕하세요. 요번 시간에는 Reference와 Pointer의 차이점에 대해서 적어보려고 합니다. 우선, 포인터(Pointer)와 레퍼런스(Reference) 둘 다, 변수에 대하여 값을 가리키거나 변수 자체에 접근하여 값을

guru.tistory.com

 

Comments