🪶
포인터 선언하기
January 09, 2024
포인터 선언하기
Understanding and Using C Pointers: Core Techniques for Memory Management 1st Edition을 읽고 정리한 내용을 기술합니다.
Understanding and Using C Pointers 정리 시리즈
포인터 선언하기
포인터 변수는 가리킬 대상의 데이터 타입과 별표 그리고 변수 이름을 순서대로 나열하여 선언한다.
별표 주위에 공백 문자를 사용하는지 여부는 선언에 전혀 영향을 주지 않는다.
다음 선언들은 모두 동등하다
int* pi;
int * pi;
int *pi;
int*pi;
공백 사용은 단지 사용자 취향의 문제다.
별표는 변수를 포인터로 선언하는 데도 사용되지만, 두 수를 곱하거나 포인터를 역참조하는 데도 사용된다.
포인터 선언을 읽는 방법
포인터 선언을 이해하기 쉽게 읽는 방법은 바로 뒤에서부터 읽는 것이다.
const int *pci;
- 변수 pci :
pci;
- 포인터 변수 pci :
*pci;
- 정수를 가리키는 포인터 변수 pci :
int *pci;
- 상수 정수를 가리키는 포인터 변수 pci :
const int *pci;
🤔 아마도 C가 이렇게 설계된 것은, 컴파일러의 LR Parsing(Bottom-Up방식)과 관련있지 않을까?
주소 연산자
주소 연산자(&)는 변수의 주소를 반환한다. 아래와 같이 주소 연산자를 사용하여 pi포인터를 num 변수의 주소로 초기화할 수 있다.
num = 0;
pi = #
포인터 변수를 선언과 동시에 초기화할 수 있다. 아래 예제는 포인터 변수 pi를 선언과 동시에 num 변수의 주소를 가리키도록 초기화한다.
int num;
int *pi = #
위와 같은 방식으로 포인터를 선언하면 다음의 코드는 대부분 컴파일러에서 구문 에러를 반환한다.
num = 0;
pi = num;
error: invalid conversion from 'int' to 'int*'
에러 메세지는 변수 pi가 정수 포인터이고 num은 정수이므로 정수를 정수 포인터로 변환 할 수 없음을 말한다.
컴파일러는 일반적으로 정수를 포인터에 할당할 경우 경고나 오류를 발생시킨다.
포인터와 정수는 엄연히 다르다.