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 |