[c++] 포인터

jw·2022년 9월 7일
0

📘 코테 준비 📘

목록 보기
30/37

주소연산자 & 와 참조연산자 *

주소연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환

참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 저장된 주소에 저장되어 있는 값을 반환

주소값 &을 *을 통해 값으로 반환할 수 있다.

화살표 함수

-> 화살표 함수를 통해 객체의 요소에 접근할 수 있다.
에스터리키*를 사용해서 값을 끄집어낼 수도 있다.

  1. (pointer_name)->(variable_name)
  2. *(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'; //에러
}

이터레이터를 이용해서 값을 바로 출력할 수는 있지만
이터레이터만 덜렁 쓴다고 주소값이 나오지 않는다.
&*를 이용해서 주소값을 출력해야한다.

call by reference와 value

어떤 값을 함수로 넘겨서 바꾸고 싶으면 주소값을 넘겨야 한다.

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 << " ";
}
profile
다시태어나고싶어요

0개의 댓글