어쩔 수 없다.. 외워라…이건 규칙임
데이터가 const/ 포인터는 다른 데이터를 가리킬 수 있음
```cpp
#include <iostream>
int main()
{
int highScore = 100;
int lowScore = 60;
const int* scorePtr = &highScore;
*scorePtr = 80; //err
scorePtr = &lowScore;
return 0;
}
```
데이터 타입 앞에 const가 있으니까 데이터가 변할 수 없다! 라고 생각하자
#include <iostream>
int main()
{
int highScore = 100;
int lowScore = 60;
int* const scorePtr = &highScore;
*scorePtr = 80; //err
scorePtr = &lowScore;
return 0;
}
포인터 변수 앞에 const가 있으니까 다른 데이터를 가리 킬 수 없다! 라고 생각하자
둘 다 const
#include <iostream>
int main()
{
int highScore = 100;
int lowScore = 60;
const int* const scorePtr = &highScore;
*scorePtr = 80; //err
scorePtr = &lowScore;
return 0;
}
const가 변수 타입, 포인터 변수 앞에 붙어 있기 때문에 데이터와 가리키는 변수 둘 다 수정 할 수 없다.
#include <iostream>
void doubleData(int* intPtr) {
*intPtr *= 2;
}
void doubleData2(int& intRef) {
intRef *= 3;
}
int main()
{
int value = 10;
int* ptr = &value;
std::cout << "이전 " << *ptr << std::endl;
doubleData(ptr);
//double Data(&value); 가능
std::cout << "이후 " << *ptr << std::endl;
doubleData2(value);
std::cout << "참조자 사용 " << value << std::endl;
return 0;
}
int* largerInt(int* a, int* b)
{
if(*a > *b)
return a;
else
return b;
}
#include <iostream>
int* creatArray(int size, int initValue = 0) { //동적으로 배열을 생성 해주고 해당 포인터 반환
int* newStorage = nullptr;
newStorage = new int[size];
for (int i = 0; i < size; i++)
*(newStorage + i) = initValue;
return newStorage;
}
int main()
{
int* myArr = nullptr;
int size;
std::cin >> size;
myArr = creatArray(size, 10);
delete[] myArr;
return 0;
}
두 포인터가 동일 데이터를 가리키다, 하나의 포인터가 메모리를 해제할 경우
지역 변수를 참조하고, 호출 스택이 끝나는 경우
#include <iostream>
int main()
{
int* first = nullptr;
int* second = nullptr;
int size = 3;
first = new int[size];
second = first;
delete[] first;
return 0;
}
변수의 별명
참조자는 (새로운) 변수가 아님
선언과 동시에 초기화 되어야 함 (Null일 수 없음)
한번 초기화되면, 다른 변수의 참조자가 될 수 없음
Const Pointer이면서 , 사용 시 자동으로 역참조를 수행하는 개념
함수의 매개변수로 자주 사용
int& , float& 등 변수 정의시에 &를 붙인 타입을 사용\
포인터와 마찬가지로, 동일한 타입에 대해서만 참조자 생성 가능
참조자를 사용할 대는 마치 변수인 것 처럼 그냥 사용한다.
Copy가 필요한 경우가 아니라면, cosnt &를 쓰는 것이 기본
여기서 말하는 Copy란 값의 변화를 주고 싶지 않고 단순히 출력하는 등의 동작 할 때
cpp에서 가장 많이 사용하는 패턴임
Const & rvalue 전달 가능
#include <iostream>
#include <vector>
int sum(const std::vector<int>& numbers) {
int total = 0;
for (const int& num : numbers) {
total += num;
}
return total;
}
int main() {
std::vector<int> myNumbers = {1, 2, 3, 4, 5};
std::cout << "Sum: " << sum(myNumbers) << std::endl; // 복사본을 만들지 않고 합계를 계산
return 0;
}
위의 코드와 같이 값의 변경을 원하지 않고 단순히 출력 및 합계를 낼 때 ‘const &’ 를 사용하여 메모리를 절약한다.
아래의 코드는 모두 a의 값인 5를 그대로 출력함
int* ptr; //정의
*ptr = 10; // 역참조
int& b;// 정의
int* ptr = &b // 변수의 주소값 반환