2022. 4. 2. 01:44ㆍC++
> 포인터를 알기 위해선 주소 연산자와 역참조 연산자를 알 필요가 있다.
주소 연산자(&)
주소 연산자 &를 사용하면 변수에 할당된 메모리 주소를 확인할 수 있다.
역참조 연산자 (*)
역참조 연산자 * 를 사용하면 특정 주소에서 값에 접근할 수 있다.
#include <iostream>
using namespace std;
int main(void)
{
int x = 3;
cout<<x<<endl; // 3
cout<<&x<<endl; // 0x61ff0c
cout<<*&x<<endl; //3
return 0;
}
포인터
> 메모리 주소를 저장하는 변수이다.
포인터 선언
포인터의 선언은 아래와 같다.
int * ptr1; //int형 포인터
double * ptr2; //double형 포인터
char * ptr3; //char형 포인터'
std::string * ptr4 //string형 포인터
Tip. 포인터 변수를 선언하는 경우 별표가 각 변수에 포함되어야 한다.
int * ptr1, ptr2; //ptr1은 포인터지만 ptr2는 변수다
포인터 값 할당
포인터는 메모리 주소를 저장하므로, 포인터의 값은 주소여야한다.
변수의 주소를 얻기위해서는 주소연산자(&)를 사용한다.
int value = 4;
int * ptr = &value; //포인터 변수의 자료형은 가리키는 변수의 자료형과 같아야한다.
다음은 올바르지 않은 코드다.
int * ptr = 5;
포인터는 주소만 보유할 수 있기 때문이다.
또한 포인터에 메모리주소를 직접 할당할 수 없다.
double ptr = 0x61ff0c; // 정수를 할당하는 것으로 취급
정리하자면 아래와 같다.
- ptr은 &value 값과 같다.
- *ptr은 value 값과 같다.
즉 *ptr은 value와 같게 취급된다.
배열과 포인터
배열 변수는 배열의 첫 번째 주소를 가지고 있다.
#include <iostream>
int main(void)
{
int array[5] = {1,2,3,4,5};
std::cout<<array<<std::endl; // 0x61ff08
std::cout<<&array[0]<<endl; // 0x61ff08
return 0;
}
하지만 배열과 포인터는 엄연히 구분된다.
array는 int[5]의 타입이고, 배열에 대한 포인터는 int* 타입니다.
또한 포인터를 통해 배열의 모든 요소에 접근 가능하지만, 배열길이와 같이 배열 타입에서 얻을 수 있는 정보는 포인터에서 접근할 수 없다.
sizeof()연산자를 사용하면 배열에서는 배열의 전체 크기를 반환하지만, 포인터에서는 메모리주소의 크기(바이트)를 반환한다.
출처: https://boycoding.tistory.com/201?category=1009770 [소년코딩]
'C++' 카테고리의 다른 글
new와 delete (0) | 2022.04.03 |
---|---|
malloc & free (0) | 2022.04.03 |
Reference (0) | 2022.04.03 |
template (0) | 2022.04.02 |
call-by-reference & call-by-value (0) | 2022.04.02 |