5/7 (코드카타)

2026. 5. 7. 16:36·본캠프
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> absolutes, vector<bool> signs) {
    int answer = 0;
    
    for (int i = 0; i < absolutes.size(); i++) {
        if (signs[i]) {
            answer += absolutes[i];
        } else {
            answer -= absolutes[i];
        }
    }
    
    return answer;
}  // 배열안에 절대값이있고 true면양수 false면 음수 모두 더한값 출력

 

 

강의 포인터와 레퍼런스

 

일반변수에서 대입 연산 =를 하면 변수에 있는 값이 그대로 복사됩니다.

하나의 변수를 다른 변수에 대입하면 새로운 메모리 공간에 동일한 값이 복제됩니다.

따라서 복사 이후에 두 변수는 서로 독립적인 공간을 가지므로, 한 쪽 값을 변경해도 다른쪽에는 영향이 없습니다.

 

하지만 복사비용이 있습니다.

배열의 크기가 커지면 복사 비용이 꽤 부담스러울 수 있습니다.

이러한 복사비용 때문에 C++에서는 값을 직접 복사하는 방식 대신 변수의 주소를 가리켜서 동일한 데이터에 접근할 수 있도록 할 수 있게 해줍니다.

 

 

포인터의 모든 연산은 주소값과 관련되어 있습니다.

A=B를 하면 B에있는 값이 A변수에 그대로 저장됩니다.

값이 아닌 주소값의 정보를 제공하겠다는 것을 알려줘야 합니다.

이때 사용하는 연산자가 &입니다.

A=B가 아닌,A=&B를 하게 되면 A에 B의 주소값이 들어갑니다.

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int* p = &a; // 변수 a의 주소를 포인터 p에 저장

    cout << "변수 a의 값: " << a << endl;
    cout << "변수 a의 주소: " << &a << endl;
    cout << "포인터 p의 값(저장된 주소): " << p << endl;

    return 0;
}

/*
출력 결과:
변수 a의 값: 10
변수 a의 주소: 0x61ff08 (주소는 실행할 때마다 다를 수 있음)
포인터 p의 값(저장된 주소): 0x61ff08
*/

 

포인터 변수의 역참조

포인터는 주소를 다루는 특성 떄문에 산술 연산 역시 주소를 제어하는 방식으로 동작합니다.

 

이를 위해 역참조 연산자 *를 사용합니다.

A를 출력하면 주소값이 나오고, *A를 출력하면 해당 메모리에 있는 값이 나옵니다.

#include <iostream>
using namespace std;

int main() {
    int x = 3;    // 정수형 변수 x 선언
    int* ptr = &x; // 포인터 ptr에 x의 주소 저장

    cout << "x의 값: " << x << endl;
    cout << "x의 주소: " << &x << endl;
    cout << "ptr의 값(저장된 주소): " << ptr << endl;
    cout << "*ptr이 가리키는 값: " << *ptr << endl;

    return 0;
}

/*
출력 결과:
x의 값: 3
x의 주소: 0x61ff00 (주소는 실행할 때마다 다름)
ptr의 값(저장된 주소): 0x61ff00
*ptr이 가리키는 값: 3
*/

 

배열과 포인터의 차이

배열의 이름은 사용될 때 대부분 포인터로 암시적 형 변환되어 동작합니다.

ex) in arr[4];가 있을 때 arr은 배열 전체를 의미합니다.

하지만 식이나 인자로 사용되면 int*형으로 변환되어 배열의 첫번째 원소 주소로 해석됩니다.

 

 

#include <iostream>
using namespace std;

// 레퍼런스를 활용하여 변수에 별명을 부여하는 예제
int main() {
    int var = 10;
    int& ref = var; // var의 레퍼런스 선언

    cout << "초기 값:" << endl;
    cout << "var: " << var << endl; // 10
    cout << "ref: " << ref << endl; // 10

    ref = 20; // ref를 변경하면 var도 변경됨

    cout << "ref 값을 변경한 후:" << endl;
    cout << "var: " << var << endl; // 20
    cout << "ref: " << ref << endl; // 20

    return 0;
}

/*
출력 결과:
초기 값:
var: 10
ref: 10
ref 값을 변경한 후:
var: 20
ref: 20
*/

레퍼런스

포인터를 사용하면 주소값을 직접 다루어야 하므로 복잡해질 수 있습니다.

이 문제를 완화하기 위해 C++에서는 변수에 또 다른 이름을 부여하는 'fpvjfjstm'문법을 도입했습니다.

레퍼런스는 일반 변수와 거의 동일하게 사용할 수 있습니다.

그러나 내부적으로는 해당 변수를 직접 가리켜 주는 역할을 합니다.

 

포인터와 레퍼런스의 차이점

1.선언과 초기화 시점이 다릅니다.

-포인터는 선언 후, 나중에 =연산자를 통해 가리킬 대상을 변경할 수 있습니다.

반면에 레퍼런스는 선언과 동시에 초기화해야 하며,

초기화 이후에는 다른 대상에 재연결할 수 없습니다.

2.레퍼런스는 항상 다른 변수와 연결되어 있기 때문에 NULL이라는 게 없습니다.

-반면에 포인터는 유효한 대상이 없음을 나타내기 위해 NULL 혹은 nullptr을 가질 수 있습니다.

3.간접 참조 문법의 유무입니다.

-포인터는 주소값을 담으므로 접근할 때는 *연산을 사용하고 주소를 가져올 때는 &연산을 사용합니다.

하지만 레퍼런스는 변수 자체의 별명이므로 일반변수와 연산하는 방법이 동일합니다.

'본캠프' 카테고리의 다른 글

5/18 (코드카타, 팀프로젝트, 강의)  (0) 2026.05.11
5/8 (코드카타)  (0) 2026.05.08
텍스트던전rpg 분석  (0) 2026.05.06
5/6 (개인프로젝트,과제2도전step8)  (0) 2026.05.06
4/30(코드카타)  (0) 2026.04.30
'본캠프' 카테고리의 다른 글
  • 5/18 (코드카타, 팀프로젝트, 강의)
  • 5/8 (코드카타)
  • 텍스트던전rpg 분석
  • 5/6 (개인프로젝트,과제2도전step8)
백구
백구
게임개발 공부블로그 입니다.
  • 백구
    백구 게임개발 스터디
    백구
  • 전체
    오늘
    어제
    • 분류 전체보기 (21) N
      • 사전캠프 (5)
      • 본캠프 (16) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
백구
5/7 (코드카타)
상단으로

티스토리툴바