📚책읽기

[C/C++] 포인터 변수, 포인터 배열

공대 컴린이 2022. 3. 7. 15:16
728x90
  • 포인터 변수
    • 포인터 변수주소를 저장하는 변수로써 <자료형 + * + 변수명> 형태로 작성된다.
      포인터 변수에서 자료형은 해당 포인터에게 전달된 주소를 해석하는 단위로써 사용된다.

      int i = 100;
      int* pInt = &i;

      위의 포인터 변수는 변수 i의 주소를 저장하며 int형이므로 4바이트 단위로 주소를 해석하게 된다.

    • 포인터의 해석
      주소는 정수 표현이기 때문에 bit단위로 표현될 수 없어 Byte 단위로만 해석된다.

      포인터 변수는 "이미 답이 정해진 변수"이다.
      포인터 변수를 int*로 선언하였으면 해당 주소의 데이터는 int형이어야만 한다.

    • 만약 자료형이 float인 경우도 4byte 단위이고, int인 경우도 4byte 단위로 같은 경우, float을 int형 포인터 배열(int*)에 저장하게 된다면 어떤 문제점이 발생할까?
float f = 3.f;
int* pInt = (int*)&f; // int*로 형변환 해주지 않으면 에러 발생

int i = *pInt;
    • float f 변수에 실수 3.f을 저장한 뒤 int형 포인터가 주소 값의 데이터를 해석하도록 하였다.
      이후 int형 변수 i를 출력해보면 결과는 '3'이 아닌, '1077936128..'이 출력된다.

      변수 f 에는 실수 표현방식(부동소수점)의 3이 들어있다.
      (float형의 부동소수점은 32bit로 이루어져있어 00.0000000~ 형태로 저장된다.)
      그러나 포인터 변수 pInt는 int형이기 때문에 int관점에서 부동소수점을 해석하여 모든 비트를 정수로 해석하게 되고, 그로인해 i의 결괏값이 매우 큰 수로 출력된다.

    • 포인터의 크기
      포인터의 크기는 프로그래머가 목적으로 하는 운영체제에 따라 변화한다.
      사용하려는 운영체제가 32bit 기반이라면 포인터의 크기는 4byte이고, 운영체제가 64bit라면 8byte이다.

    • 포인터의 주소 저장
      int i = 0;
      int* pInt = &i;
      pInt의 주소가 100이라면 i는 int형이므로 4byte 단위로 주소가 해석된다.
      따라서 int i의 변수 값은 101, 102, 103, 104번지에 저장된다.

      만약 "pInt+1"을 수행한다면 101번지가 아닌 104번지가 된다.

      정리하자면, pInt는 int* 변수이기 때문에 가리키는 곳을 int로 해석한다. 따라서 주소 값을 1 증가하는 의미는 다음 int 위치로 접근하기 위해 sizeof(int) 단위로 증가한다고 해석된다.
  • 포인터와 배열
    • 배열의 특징
      1. 메모리가 연속적인 구조이다.
      2. 배열의 이름은 배열의 시작 주소이다.
int iArr[10] = {};

// int 단위로 접근
*(iArr + 0) = 10; // iArr[0] = 10;
*(iArr + 1) = 10; // iArr[1] = 10;
    • 포인터 배열의 + 0, 1 은 배열의 인덱스를 움직이는 것과 같다.

 

728x90