주소연산자
는 변수의 이름 앞에 사용하여, 해당 변수의주소값
을 반환
참조 연산자
는 포인터의 이름이나 주소 앞에 사용하여,포인터에 저장된 주소에 저장되어 있는 값
을 반환
주소값 &을 *을 통해 값으로 반환할 수 있다.
->
화살표 함수를 통해 객체의 요소에 접근할 수 있다.
에스터리키*
를 사용해서 값을 끄집어낼 수도 있다.
- (pointer_name)->(variable_name)
- *(pointer_name).variable_name
예시 코드
int main()
{
map<string, int> m;
m.insert({"coding", 1});
m.insert({"test", 2});
// map의 find메소드는 찾지 못하면 map.end() 이터레이터를 반환한다.
auto search = m.find("coding");
if (search != m.end())
{
cout << search->first << " " << (*search).second << "\n";
}
}
/*
출력
coding 1
*/
search->first
(*search).second
search라는 포인터를 기반으로 map의 키인 first와 map의 값인 second를 끄집어내는 것
이터레이터는 컨테이너(배열 등)의 메모리 주소를 가리키는 데 사용
되며 주소값을 바로 반환하지 않는❌ 포인터의 일종
이다.
ex) begin(), end()
int main()
{
vector<int> v;
for (int i = 1; i <= 5; i++)
v.push_back(i); // 1 2 3 4 5
for (int i = 0; i < 5; i++)
{
cout << i << "번째 요소: " << *(v.begin() + i) << "\n";
cout << "주소값: " << &*(v.begin() + i) << "\n";
}
// cout << v.begin() << '\n'; //에러
}
이터레이터를 이용해서 값을 바로 출력할 수는 있지만
이터레이터만 덜렁 쓴다고 주소값이 나오지 않는다.
&*
를 이용해서 주소값을 출력해야한다.
어떤 값을 함수로 넘겨서 바꾸고 싶으면 주소값을 넘겨야 한다.
int idx = 2;
void fu(int &idx)
{
idx = 1;
}
void fu2(int idx)
{
idx = 100;
}
int main()
{
cout << "Origin value: " << idx << "\n";
fu(idx);
cout << "주소값 넘긴 함수 실행: " << idx << "\n";
//1로 값 바뀜
fu2(idx);
cout << "그냥 값 넘긴 함수 실행: " << idx << "\n";
//값 안바뀜
}
배열 이름 자체에 배열의 주소값의 첫번째 시작 주소가 담겨있다.
따라서 배열 이름이 a일 때 *(a+2)
를 하면 배열의 2번 째 값이 반환된다.
그리고 이미 이름에 주소가 담겨있어서 외부 함수로 넘길 때도 주소값을 넘길 필요가 없다.
int a[3] = {1, 2, 3};
void fu(int a[])
{
a[2] = 100;
}
int main()
{
cout << *(a + 2) << "\n";
//3
fu(a);
for (int i : a) cout << i << " ";
}