#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 |