본문 바로가기
프로그래밍 언어/C언어

[C언어 #4] 포인터 (const, void*, 형변환)

by 디버그러 2024. 11. 20.

C#을 배우다 C언어를 배우게 되면 포인터라는 새로운 개념을 접하게 됩니다.

포인터는 C언어의 중요한 특징 중 하나로, 성능을 높이고 메모리를 효율적으로 관리할 수 있게 합니다.

포인터를 적절히 활용하면, 100바이트를 사용할 데이터를 4바이트로 줄여 처리할 수 있습니다.

 

 

 


 

 

1. 포인터 개념

 

운영체제는 메모리를 1바이트 단위로 관리합니다.
32비트 운영 체제에서는 0번지부터 약 42억 번지(2³² - 1)까지의 메모리 주소가 부여되며,

이 주소 범위를 저장하려면 4바이트가 필요합니다.

 

포인터는 바로 이 메모리 주소를 저장하는 변수입니다.
포인터가 4Byte 크기를 가지는 이유도, 메모리 주소를 표현하기 위해 unsigned int와 같은 4Byte가 필요하기 때문입니다.

 

 

 


 

 

2. 포인터 선언(*)
(자료형)* (변수 이름);

 

포인터는 자료형 앞에 *을 붙여 선언합니다.

위의 포인터 3개의 크기는 모두 4Byte로 동일하며, 자료형은 포인터가 가리킬 데이터의 형식을 나타냅니다.

 

 

 


 

 

3. 포인터 정의
(포인터 이름)  =  &(변수 이름);

 

c_ptr = &c_num; 처럼 포인터 변수를 선언 후에 정의할 수도 있고,

int* i_ptr = &i_num; 처럼 포인터 변수를 선언함과 동시에 정의할 수 있습니다.

 

여기서 & 연산자는 변수의 메모리 주소를 반환합니다.

이를 이용해 포인터에 주소를 할당할 수 있습니다.

 

 

 


 

 

4. 번지 지정 연산자(*)
*(포인터 이름)  =  (대입할 값);

 

포인터 앞에 *를 붙이면 포인터가 가리키는 변수의 값에 접근할 수 있습니다.
이를 통해 값을 읽거나 수정할 수 있습니다.

위의 코드에서 *i_ptr = 200; 은 i_num의 값을 200으로 변경합니다.

 

  • ptr = ... → 포인터가 가리키는 대상의 주소 변경
  • *ptr = ... → 포인터가 가리키는 대상의 변경

 

선언할 때 int* 와는 다른 의미입니다.

 

 

 


 

 

5. const 키워드
  • int* const ptr;
    주소 변경 금지: ptr이 가리키는 대상의 주소를 변경할 수 없음
  • const int* ptr;
    변경 금지: ptr이 가리키는 대상의 값을 변경할 수 없음
  • const int* const ptr;
    주소와 값 모두 변경 금지: ptr의 주소와 값을 모두 변경할 수 없음

 

const 키워드를 사용하면 포인터가 가리키는 주소나 값을 변경하지 못하도록 제한할 수 있습니다.

 

 

 


 

 

6. void*형 포인터

 

void*는 크기가 정해지지 않은 범용 포인터입니다.

대상 메모리를 사용하려면 형변환을 통해 사용할 데이터의 크기를 명시해야 합니다.

 

 


 

 

 

7. 형 변환을 활용한 특정 크기 데이터 접근

 

포인터를 사용하면 메모리의 일부를 직접 제어할 수 있습니다.

값이 0x11111111(16진수) 인 num 변수에 형 변환을 통해 일부만 값을 변경할 수 있습니다.

 

위의 코드는 char*형 포인터를 통해 char(1바이트) 크기만큼 0으로 변경하고,
short*형 포인터를 통해 short(2바이트) 크기만큼 0으로 변경했습니다.