C++/개념정리

개념정리[연산자(&*)]

jeongchanhyo 2025. 2. 7. 21:05

C++을 공부하다보면 특정 코드를 보고 배우거나 하는데 내가 직접 할 때 헷갈리는것들이 몇개 있는데 제대로 개념을 잡고가기위해 쓰는 메모장이다.

&연산자

1. &(주소 연산자)

변수의 주소를 가져올 때 사용된다. 이는 포인터와 함께 사용할 때 유용하다.

int main() 
{
    int x = 10;
    int* ptr = &x;  // ptr은 x의 메모리 주소를 가리킴
    cout << "Address of x: " << ptr << endl;  // Output: x의 메모리 주소
    cout << "Value of x: " << *ptr << endl;   // Output: 10
    return 0;
}

2. &(참조 연산자)

참조를 선언할 때 사용된다. 참조는 변수의 별명처럼 동작하며, 원본 변수와 동일한 메모리 위치를 참조

int main() 
{
    int y = 20;
    int& ref = y;  // ref는 y의 참조
    cout << "Value of y: " << y << endl;    // Output: 20
    cout << "Value of ref: " << ref << endl; // Output: 20

    ref = 30;  // ref를 통해 y의 값을 변경
    cout << "New value of y: " << y << endl; // Output: 30
    return 0;
}

참조인데 ref를 변경하면 y값도 변경이 되는걸 볼 수 있다. 말 그대로 변수의 별명이라고 생각하면 좋을거같다. 위의 주소연산자와는 다르다.

3.&(함수 매개변수)

함수 매개변수로 &를 사용하면, 함수에 인자를 참조로 전달할 수 있다.

이렇게 하면 함수 내에서 원본 변수를 직접 수정할 수 있다.

#include <iostream>
using namespace std;

void increment(int& num)
{
    num++;  // 원본 변수의 값을 증가시킴
}

int main() 
{
    int z = 5;
    increment(z);
    cout << "Value of z after increment: " << z << endl;  // Output: 6
    return 0;
}

이처럼 함수를 통해 반환하는 것 뿐만 아니라 함수에 들어오는 입력값을 변환할 수 있다는 특징이 있다.

4.&(논리 연산자 AND)

&&는 논리 AND연산자로 두개 다 참일 때만 true를 반환한다.

int main() 
{
    bool condition1 = true;
    bool condition2 = false;

    if (condition1 && condition2) 
    {
        cout << "Both conditions are true." << endl;
    } 
    else 
    {
        cout << "At least one condition is false." << endl;
    }
    return 0;
}

여기까지가 &다..... 나는 주소 연산자로만 알고있었는데 자꾸 내 지식으로는 이해가 안되는곳에서 &가 튀어나와서 너무 헷갈렸었다. 정리를 해보자면

  • 주소 연산자 : 특정 변수의 주소를 가져온다.
  • 참조 연산자 : 변수를 다른이름으로 쓰는느낌 같은 메모리 주소를 가짐.
  • 함수 매개변수 : 함수 내에서 원본 변수 수정가능
  • 논리 연산자 : 논리 AND연산자.

*연산자

1.*(포인터 선언 및 역참조 연산자)

포인터 선언

int* ptr;  // ptr은 int 타입의 포인터

int 타입의 포인터란 int형 변수의 주소를 가리키는 포인터다. 그래서 이렇게 선언을 한 후 저 포인터에 주소값을 넣어주면 된다.

int a = 10;     // 정수형 변수 a를 선언하고 10으로 초기화
int* ptr;      // int형 변수를 가리키는 포인터 ptr를 선언

ptr = &a;      // a의 주소를 ptr에 저장
*ptr = 20;  // ptr이 가리키는 메모리 주소에 20을 저장 (즉, a의 값이 20으로 변경됨)

그리고 이 포인터를 이용하여 값을 변경할 수 있다.

2.*(포인터와 배열에서 포인터)

포인터에 배열의 이름을 사용하면 그 배열의 첫번째 요소를 가리키는 포인터로 사용된다.

int main()
{
    int arr[3] = {10, 20, 30};
    int* ptr = arr;  // arr은 배열의 첫 번째 요소를 가리키는 포인터

    cout << "First element: " << *ptr << endl;       // Output: 10
    cout << "Second element: " << *(ptr + 1) << endl; // Output: 20
    cout << "Third element: " << *(ptr + 2) << endl;  // Output: 30
    return 0;
}

이렇게 포인터에서 특정 n번째 값을 사용하고거나 할 때 사용가능하다.

3. *(함수 매개변수 연산자)

함수 매개변수로 포인터를 전달하면, 함수 내에서 원본 변수의 값을 수정할 수 있다.

void increment(int* num) 
{
    (*num)++;  // 포인터를 통해 원본 변수의 값을 증가시킴
}

int main() 
{
    int z = 5;
    increment(&z);  // z의 주소를 전달
    cout << "Value of z after increment: " << z << endl;  // Output: 6
    return 0;
}

4. *(동적 메모리 할당)

new키워드를 사용하여 동적으로 메모리 할당할 때, *를 사용해 포인터로 메모리 관리를 한다. 

int main() 
{
    int* ptr = new int;  // 동적으로 int 타입 메모리 할당
    *ptr = 42;           // 할당된 메모리에 값 저장
    cout << "Value: " << *ptr << endl;  // Output: 42

    delete ptr;  // 메모리 해제
    return 0;
}

요약

  • 포인터 선언 및 역참조 *: 포인터를 선언하거나 포인터가 가리키는 값을 가져올 때 사용..
  • 배열과 포인터 *: 배열의 요소에 접근할 때 사용.
  • 함수 매개변수 *: 포인터를 통해 함수에 인자를 전달.
  • 동적 메모리 할당 *: new와 delete로 동적 메모리를 관리.

※함수 매개변수 &와 *의 차이※

& *는 함수 매개변수로 사용될 때 **참조(Reference)**와 **포인터(Pointer)**를 각각 나타내며, 둘 다 함수 내에서 원본 변수를 수정할 수 있다. 하지만 두 방식은 사용법과 동작 방식에서 차이가 있다. 너무 헷갈렸다.

우선 표로 차이점을 보여주자면.

특징 참조(&) 포인터(*)
구문 간단함(&로 선언, *없이 사용) 복잡함(*로 선언, *로 역참조)
Null값 불가능(항상 유효한 변수 참조) 가능(nullptr로 초기화 가능)
초기화 선언과 동시에 초기화 필수 초기화 필수 아님

이렇게 볼 수 있다.

사용할 때 어떤걸 사용해야될까?

  • 참조(&)
    • 함수 내에서 원본 변수를 간단히 수정할 때.
    • Null값이 필요하지 않은 경우.
    • 코드를 간결하게 작성하고 싶을 때.
  • 포인터(*)
    • 동적 메모리 할당(new, delete)을 다룰 때.
    • Null값이 필요하거나, 유효하지 않은 상태를 표현해야 할 때.
    • 배열이나 복잡한 데이터 구조를 다룰 때.

 

'C++ > 개념정리' 카테고리의 다른 글

전략패턴  (0) 2025.02.26
[디버그 입문]  (1) 2025.02.11
C++[코드변경 깃허브 적용]  (0) 2025.01.13
C++[디자인 패턴]  (1) 2025.01.06
C++[SOLID 원칙]  (0) 2025.01.03