[C/C++] 포인터와 상수

HwangBBang·2023년 1월 30일
0

포인터(Pointer)

포인터 변수란?

int* pInt1 = nullptr; 
int* pInt2 = &p ; 

포인터 변수: 주소를 가리키는 변수이다.

포인터 변수의 자료형

어떤 데이터 타입을 가리킬건지 정하는 용도이다.
포인터 변수에 자료형이 있는 이유는 다음과 같다.
만약에 포인터 변수에 자료형이 없다면?

가리키는 주소로 접근하였을 때 어디까지 읽어야하는지 알 수 없다.
예를 들어 int 형은 4 Byte 인데 double형은 8 Byte 이다.
이런 경우 double 형을 int형으로 읽었을 떄 잘못 된 값으로 해석해서 전혀 이상한 주소로 접근 할 수 있다.
이런 경우 때문에 주소를 가리키는 변수(포인터 변수)의 자료형이 필요하다.

즉, 정리하자면 자료형 + * 변수명 에서 자료형 은 해당 포인터에게 전달된 주소를 해석하는 단위 이다.


// nullptr : null_Pointer == 아무것도 가리키지않는다.

int* pInt = nullptr; // int* pInt = 0;


// int* : int자료 변수를 가리키는 포인터 변수라고 선언
// pInt : 포인터 변수로서, 변수 i의 주소 값을 가리킨다(저장한다).

int i = 100;
int* pInt = &i


// 포인터 변수를 이용해 변수의 값을 수정하기

// *pInt : pInt가 가리키는(저장한(주소)) 변수를 참조(접근)할게요.
// pInt는 변수i읠 주소를 저장해두었다. 
// 따라서 *pInt 는 변수i 값을 가리킨다. 

(*pInt) = 200; // i : 100 -> i : 200 

주소(adress)

주소의 단위는 Byte = (8 Bit)
주소는 정수표현 방식

int i = 0;
int* pInt = &i;
pInt += 1;

pInt 는 int* 변수 이기때문에, 따라서 가리키는 곳 (주소)를 int 로 해석한다.
따라서 pInt += 1;"주소값을 1을 증가한다" 라는 의미는 다음 int 위치로 접근 즉, sizeof(int) : 4Byte 단위로 증가하게 된다.

포인터와 배열

배열의 특징

  1. 배열의 묶음의 메모리는 연속적인 구조이다.
  2. 배열의 이름은 배열의 시작 주소이다.
int iArr[10] = {};
// int 단위로 접근
*(iArr) = 42; // 배열의 [0]인덱스로 접근 후 초기화
*(iArr + 1) = 16; // 배열의 [1]인덱스로 접근 후 초기화

상수 (Const)

상수란?

const int i = 100; 

const : 변하지 않는 값 , 상수를 나타낸다.

상수와 포인터

#1. const 를 사용하지 않은 경우
int a = 0;
int* pA = &a;

*pA = 1; // a = 1 ,  가능
pA = nullptr; // 가능
#2. 포인터 변수가 가리키는 원본을 const화 한 경우

c.f) 포인터 변수가 가리키는 원본을 수정하는 기능이 제한되는 것

int a = 0;
const int* pConstA = &a;

*pConstA = 1; // 불가능 
pConstA = nullptr; // 가능
#3. 포인터 변수 자체를 const화 한 경우
int a = 0;
int* const pAConst = &a;

*pAConst = 1; // 가능 
pAConst = nullptr; // 불가능
#4. 포인터 변수 자체와 포인터 변수가 가리키는 원본을 const화 한 경우
int a = 0;
const int* const pConstAConst = &a;

*pAConst = 1; // 불가능 
pAConst = nullptr; // 불가능

🚨주의 사항🚨

int a = 0;
const int* pInt = &a; // 포인터변수가 가리키는 원본을 Const화

a = 100;  // 이 코드는 문제가 되지 않는다. 
*pInt = 12; // 단, 이 코드는 문제가 된다.
WHY???

const int* pInt = &a; 이 코드는 a 가 상수화가 된 것이 이라고 말하는게 아니다.
int* 포인터의 기능을 제한한 것 이지 a 라는 변수가 상수화가 된 것이 아니기 때문이다.

profile
https://hwangbbang.tistory.com/

0개의 댓글