컴퓨터가 정보를 저장하는 방식
컴퓨터는 기본적으로 bit단위로 정보를 저장한다. (8bit = 1byte)
int a = 1024를 컴퓨터가 저장한다고 가정하자.
1024는 2의 10제곱이므로 1바이트(8비트 = 256)의 크기를 넘어간다. 따라서 옆의 메모리까지 연속하여 사용하게 된다.
그림을 보면서 이해해보자.
컴퓨터에는 메모리가 있고, 메모리마다 주소값이 있다. 만약 a를 저장한다면, 메모리공간이 총 4칸이 필요하게 된다.
주소값은 컴퓨터의 메모리 안에서의 실제 위치를 가르킨다. 우리는 포인터를 이용해 직접 그 데이터에 접근할 수 가 있다.
1024처럼 여러 공간을 차지한다면, 여러 메모리공간의 주소값의 가장 첫번째 부분을 가르킨다.
예시에서의 주소값은 100이 된다.
포인터 변수
포인터 변수를 선언하는 방법은 2가지다.
변수의 주소값을 가르키는 변수를 포인터라고 한다.
위 사진의 의미는 정수형 데이터를 담고 있는 메모리의 주소값을 담을 변수를 선언한 것이다.
당연히 다른 타입들의 데이터의 주소도 가능하다.
1) 주소 연산자
변수의 주소값을 불러오는 연산자로 &를 사용한다.
변수 a에 대해서 &a라고 하면 a의 메모리 주소값을 가르키는 것이다.
위의 코드처럼 사용하면 p에 i의 주소값이 저장된다.
2) 참조 연산자
&말고 또 다른 연산자로 *연산자가 있다. 참조 연산자라고 불리며 처음에 포인터를 선언할때 사용했던 *와는 다른의미라는 것을 주의해야한다.
위의 코드를 작성한 결과로는 10이 출력된다. 즉 *연산자는 해당 주소값에 들어있는 데이터를 가르킨다.
여러개의 포인터가 주소값이 같을수도 있다.
위의 코드에서 p 와 q는 동일한 주소값을 가지게 된다.
그래서 참조 연산자로 데이터를 수정하면, *p, *q, i 3개의 값이 모두 수정된다.
포인터를 가르키는 포인터
포인터는 어떤 변수의 주소값을 가리키는 변수이다. 방금 말에서 2중 포인터에 대한 설명이 나왔다.
변수의 주소값을 가리킨다고 했으니 당연히 포인터로 다른 포인터 변수를 가리킬 수 있다.
이러한 포인터를 더블 포인터라고 한다.
그림을 참고하면 이해에 도움이 될 것이다.
선언하는 방법은 다음과 같다.
q에 i의 주소값이 들어있고, p에는 q의 주소값이 들어있다. 참조연산자도 2개를 써줘서 출력값은 10이된다.
함수에서의 포인터
함수에 파라미터로 포인터를 입력한다면 변수의 주소값을 직접 넘겨준다는 것이다.
C를 공부한 사람들이 맨날 하는 소리가 "C는 데이터가 저장된 공간에 직접 접근할 수 있다" 이다.
함수에서 포인터를 통해 메모리 공간에 접근하고 데이터를 수정하면 함수 밖의 데이터에 직접적인 영향이 있다는 뜻이다.
우리는 사실 지금까지 함수로 계속 데이터를 받아왔다. scanf("%d", &i)를 생각해보자.
&(주소 연산자)를 이용하여 메모리 영역에 접근하고, 그 공간에 USER가 입력한 값을 할당해왔을 것이다.
따라서 scanf함수를 다음과 같이도 사용할 수 있다.
함수의 파라미터로 포인터 변수를 받았는데 값을 수정하지는 않고 참조만 하고 싶다면 const를 사용하면 된다.
'📚알고리즘 > C 언어' 카테고리의 다른 글
2주차 [배열과 동적할당] (0) | 2023.04.04 |
---|