[C] 포인터
포인터는 메모리 공간의 주소를 의미한다.
포인터만 따로 처리하는 타입으로 포인터 타입이 있다. ( * 로 표시하고, "%p"를 사용 )
변수를 저장할 때 처음부터 포인터와 값을 함께 기록하면 좋지만, 저장할 때 메모리 공간이 따로 들어가고 매번 값을 확인해야 하기 때문에 잘 사용하지 않는다.
대신 크기별로 전담 변수를 둬 데이터의 타입으로 덩어리의 크기를 표현하는 방법을 사용한다. (int타입이면 int포인터, char타입이면 char포인터)
int형 포인터 ptr1에 대해서 주소로 접근해 데이터를 읽을 때는 4byte를 한 덩어리로 보고 읽어온 값은 int형으로 처리한다.
char형 포인터 ptr2에 대해서 주소로 접근해 데이터를 읽을 때는 1byte를 한 덩어리로 보고 읽어온 값은 char형으로 처리한다.
포인터 변수를 선언할 때는 왼쪽과 같이 타입을 함께 작성한다.
(포인터 변수의 크기는 4바이트 혹은 8바이트이다. 컴파일러의 환경에 따라 다름.)
이를 통해 미루어 짐작할 수 있듯, 포인터에서 미리 지정된 타입은 매우 중요하다.
지정된 타입의 크기를 기준으로 잘라서 읽기 때문에, int * ptr1 = 3.1234; 처럼 자료형이 일치하지 않는 연산은 수행할 수 없다.
(컴파일은 될 지 몰라도, 읽어들이는 크기가 다르기에 의도대로 동작하지 않는다)
포인터 변수에 값을 넣을 때는 어떻게 해야 할까?
int a = 3; 처럼 하드코딩식으로 대입하면 안된다. (int * ptr1 = 3;)
어셈블리어에서는 가능했지만, 3이라는 주소가 운영체제에서 매우 중요한 부분 일 수도 있고.. 보안을 위해서 금지한다.
int * p;
int num = 5;
p = &num
위와 같이 포인터 변수는 주소를 통해 접근해야 한다. (& 사용)
변수의 l-valule와 r-value를 생각하면 이해하기 쉽다.
num변수의 위치를 p변수의 값에 저장한다.
scanf에서 자주 사용하던 &연산자는 변수와 함께 사용 시 변수의 위치(주소, l-value)를 알려주는 연산자이다.
즉, 변수를 주면 변수의 주소를 주는 연산자라고 생각할 수 있다.
&연산을 반대로 수행하는 연산자도 있는데, 바로 *연산자이다.
*연산자는 주소를 주면 변수의 값을 준다.
즉, l-value를 통해 r-value를 얻을 수 있다.
변수의 r-value만을 얻을 수 있어 완전히 역연산이라고는 할 수 없지만, 비슷한 역할을 수행한다. (변수를 얻을 수 없으니)
포인터를 표현하는 기호와 같아 헷갈리기 쉽다..
---- &*과 *&연산도 오류 없이 수행된다 ------
x = *pnum부분의 연산에 집중하자.
x = *pnum연산을 수행할 시 x의 l-value는 그대로지만 r-value에는 365가 할당된다.
이 부분을 이해하면 다음 내용도 문제 없이 넘길 수 있다.
역시 *연산자의 성질을 통해 *연산자와 포인터 변수를 함께 사용할 시 일반 변수로 사용할 수 있다는 점을 미루어 짐작할 수 있다.
위 예제를 통해 이해하자. num1은 130, num2는 70이 출력된다.
'Programming Language > C' 카테고리의 다른 글
[C] 포인터 연산 (0) | 2022.04.01 |
---|---|
[C] 배열과 포인터 (0) | 2022.04.01 |
[C] 문자열 (0) | 2022.03.28 |
[C] 배열 (0) | 2022.03.28 |
[C] 함수 간 소통 / 재귀 (0) | 2022.03.22 |
댓글
이 글 공유하기
다른 글
-
[C] 포인터 연산
[C] 포인터 연산
2022.04.01 -
[C] 배열과 포인터
[C] 배열과 포인터
2022.04.01 -
[C] 문자열
[C] 문자열
2022.03.28 -
[C] 배열
[C] 배열
2022.03.28