코딩항해기

[C] 포인터의 이해 본문

C

[C] 포인터의 이해

miniBcake 2024. 10. 4. 21:10

 

 

포인터

C언어에서 포인터랑 메모리의 주솟값을 의미하며 주솟값을 저장하는 변수를 포인터 변수라고 한다.

변수를 선언 및 초기화하면 메모리에 공간이 할당되는데, 포인터 변수를 사용하면 이 메모리 주소에 직접적으로 접근할 수 있게 된다. (주의할 점은 메모리의 주소는 실행할 때마다 임의로 변경된다.)

 

포인터 변수 선언과 초기화

일반 변수와 포인터 변수의 차이는 변수 이름 앞에 *(애스터리스크)를 붙인다는 것에 있다. 선언하고 나면 주솟값을 저장할 수 있게 되는데 이 과정에서 &(앰퍼샌드)연산자를 사용해 변수의 주솟값을 반환할 수 있다.

int num = 30; //포인터 변수에 저장할 주솟값을 줄 변수

int * ptr; //포인터 변수 선언

//초기화
ptr = # //&지시자를 통해 반환된 주솟값을 포인터 변수에 저장

 

 

포인터 연산

& 변수의 주솟값을 반환
* 포인터가 가리키는 메모리를 참조

 

&연산자

int num = 30; //포인터 변수에 저장할 주솟값을 줄 변수
int * ptr = # //&지시자를 통해 반환된 주솟값을 포인터 변수에 저장

//리터럴 상수 불가
int * ptr2 = &5; //불가

//타입 불일치 시 불가(경고)
double num2 = 3.14;
int * ptr3 = &num2; //경고 발생

 

*연산자

int num = 30; //포인터 변수에 저장할 주솟값을 줄 변수
int * ptr = # //&지시자를 통해 반환된 주솟값을 포인터 변수에 저장

printf("%d\n", *ptr); //출력 : 30

*ptr = 10; //*ptr은 사실상 num을 의미

printf("%d\n", *ptr); //출력 : 10

 

 

포인터 사용이유

포인터를 사용하려면 별도의 포인터 변수 선언이 필요하고 포인터 연산자를 활용해 주소 연산, 참조 연산 등을 수행해야하므로 꼭 필요한 경우가 아니라면 사용하지 않는 것이 좋다.

 

그러나 다음과 같은 경우에서는 반드시 사용해야한다.

1. 임베디드 프로그래밍(Embedded Programming)에서 메모리를 제어하는 경우
2. 동적 할당 선언 및 동적 할당 메모리에 대한 접근을 시도하는 경우

 

하드웨어를 제어하는 소프트웨어에서 메모리를 제어하는 경우 반드시 메모리에 대한 이해와 접근이 필요하기 때문이며, 동적 할당 또한 메모리에 대한 직접적인 접근을 요구하는 작업이기 때문이다.