C language - 6. pointer(포인터)

1.  메모리와 주소

컴퓨터의 메인메모리는 1byte 단위로 각각 주소가 16진수의 고정된 값이 배정되며 오른쪽 그림을 예를 들어 int(4bytes)형 변수 a를 선언 한다고 했을 때 임의의 연결된 4bytes의 공간에 int형 변수 a가 배정되게 됩니다. 이 때 배정된 4개의 공간중 가장 작은 주소값인 0x000102가 변수 a의 메모리 주소값이 됩니다. 









2. 포인터란?

포인터는 메모리의 주소값을 저장할 수 있는 변수로 어셈블리어, C, C++ 등 하위레벨까지 제어 할 수 있는 언어들에서 많이 쓰이며 Java나 타 언어들에선 쓰이지 않습니다.
포인터의 선언은 위와 같이 자료형과 변수명 사이에 *만 추가하면 됩니다.

일단 선언하게 되면 자료형에 관계없이 기계나 OS에 맞춰서 일정한 크기(대부분 4byte)가 주어져
변수를 보면 우리가 알고 있는 크기들로 나왔지만 포인터들은 모두 4byte로 나오는 것을 볼 수 있습니다. 또한 배열은 모두 10의 크기를 주었기 때문에 그에 10배에 해당되는 크기를 가지고 있습니다.

3. 포인터의 심화

포인터는 간단히 말해서 주소를 저장하는 공간 이라고 말할 수 있습니다만 실제론 기능을 더 가지고 있습니다.
기본자료형을 선언했을 때에는 각 자료형마다 저장될 크기와 읽어들인 2진수를 변환하는 방법이 다릅니다.

마찬가지로 포인터 또한 선언된 자료형에따라 읽어들일 크기와 2진수의 변환하는 방법이 다릅니다.

위 그림은 임의의 자료형 p를 char형 int형 double형 포인터들이 가리킬때 가져오는 값을 주소하나에 1비트씩 저장되있다고 가정했을때 만든것입니다. 위와같이 같은곳을 가리키더라도 선언된 자료형에 따라 가져오는 값이 달라질 수 있습니다.

또한 가져오는 값이 같은 상황에서도 2진수를 변환하는 방법이 고정소수점방식이냐 부동소수점방식이냐 혹은 signed냐 unsigned냐에 따라 얻어지는 값이 달라질 수 있습니다.

4. 결론

포인터에 저장되는 값은 단순 주소값이기는 하나, 선언된 자료형에 따라 얻어지는 값이 달라질 수 있다.

다중포인터를 보면 int ** a, long ***** b 이런식으로 되있지만 단순하게 생각해서 *의 개수만큼 변수에 저장된 값의 주로소 이동하면 선언된 자료형의 값이 저장되있다는 뜻이 됩니다.

 long ***** b를 보게되면 아래와 같이 되어있다고 보면 되겠습니다