코딩항해기
[C] 포인터의 이해 본문
포인터
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. 동적 할당 선언 및 동적 할당 메모리에 대한 접근을 시도하는 경우
하드웨어를 제어하는 소프트웨어에서 메모리를 제어하는 경우 반드시 메모리에 대한 이해와 접근이 필요하기 때문이며, 동적 할당 또한 메모리에 대한 직접적인 접근을 요구하는 작업이기 때문이다.
'C' 카테고리의 다른 글
[C] 포인터와 배열 (0) | 2024.10.05 |
---|---|
[C] 연산자 (+연산자 우선순위) (0) | 2024.10.03 |
[C] 기본 입출력함수 printf(), scanf() (0) | 2024.10.02 |
[C] C언어 기본 자료형 (+unsigned 자료형) (0) | 2024.10.01 |
[C] C언어 프로그램의 구성 (기초) (0) | 2024.09.30 |