C 언어는 메모리에 접근해서 원하는 방식으로 데이터를 사용할 수 있는 언어이다.
이것이 가능한 이유는 바로 '포인터' 덕분이다.
변수는 함수 내부로 사용이 제한되어 있다. 같은 변수명을 사용했다고 하더라도 블록이나 함수가 다르면 별도의 저장 공간을 확보하므로 아예 다른 변수로 사용된다.
사용 범위를 벗어난 경우도 데이터를 공유할 수 있도록 하는 포인터의 개념을 알아보자!
메모리 주소
메모리는 우리가 데이터를 넣고 꺼내 쓰는 공간이다. 그래서 그 위치를 식별할 수 있어야한다. 메모리의 위치는 주소값으로 식별할 수 있다.
주소값은 '바이트 단위'로 구분된다. 0부터 시작하고, 바이트 단위로 1씩 증가한다.
int a = 10;
위와 같이 선언했다고 하자.
위 문장은 100번지부터 103번지 까지 4 바이트 공간에 10을 저장하며,
a + 20;과 같은 수식은 메모리 100번지부터 103번지까지 4 바이트에 저장된 값과 20을 더하는 연산을 수행한다.
주소 연산자 : &
주소는 할당된 메모리 공간의 시작 주소를 의미한다. 시작 주소를 알면 그 위치부터 변수의 크기만큼 메모리를 사용할 수 있다.
주소는 주소 연산자인 &을 사용한다.
&변수명 -> 시작 주소를 구한다.
메모리 시작 주소를 구하고 이 주소에 변수의 크기를 더하면 메모리의 어디서부터 어디까지 변수의 메모리가 할당되었는지 알 수 있다.
포인터의 간접 참조 연산자 : *
메모리의 주소는 필요할 때마다 주소 연산을 수행하기 보다 한 번 구한 주소를 저장하여 사용하면 편리하다. 포인터가 메모리의 주소를 저장하는 변수이므로 주소를 저장할 포인터 역시 변수처럼 선언하고 사용한다.
선언할 때 변수 앞에 *를 붙여주면 된다.
#include <stdio.h>
int main(void) {
int a;
int *pa;
p = &a;
*pa = 10;
printf("포인터로 a 값 출력: %d\n", *pa);
printf("변수명으로 a 값 출력: %d\n", a);
return 0;
}
포인터 변수가 선언되면 일반 변수와 마찬가지로 메모리에 저장 공간이 할당되고 그 이후에는 변수명으로 사용할 수 있다.
pa = &a; <- 포인터에 a의 시작 주소를 저장하는 문장이다.
이렇게 포인터가 어떤 변수의 주소를 저장한 경우 '가리킨다'고 하고, 둘의 관계를 pa -> a 처럼 화살표로 표현할 수 있다.
pa는 포인터이며, 변수 a의 주소를 저장하고 있다는 의미이다.
포인터가 어떤 변수를 가리키면 포인터로 포인터가 가리키는 변수를 사용할 수 있다.
즉, 포인터 pa 로 변수 a 를 사용 가능하고, 이때 사용하는 특별한 연산자를 '간접 참조 연산자'라고 한다.
*pa // 포인터를 가리키는 변수이다.
*pa는 a와 동일하게 사용된다.
포인터가 가리키는 변수의 자료형과 포인터의 자료형은 동일하게 선언한다. 포인터를 선언하여 변수의 주소값을 대입한 후에는 포인터의 간접 참조 연산자를 이용하여 가리키는 변수를 사용할 수 있다.
만일 여기서 CONST 예약어를 사용하면 가리키는 변수를 바꿀 수 없게된다.** pa가 가리키는 변수 a는 pa를 간접 참조하여 바꿀 수 없다는 의미이다. 직접 참조하여 바꾸는 것은 됨!
'공부 STUDY > C | C++' 카테고리의 다른 글
[ C ] 변수 사용 영역 | 지역 변수 | 전역 변수 | 정적 지역 변수 | 레지스터 변수 (0) | 2023.01.29 |
---|---|
[ C ] 주소와 포인터 차이? | 포인터의 크기 | 포인터 자료형 | 포인터 기능 (0) | 2023.01.28 |
[ C ] 문자를 저장하는 배열 | char 형 배열 | 문자열 대입 방법 | strcpy(), gets(), puts() (0) | 2023.01.28 |
[ C ] 배열 | 배열의 선언과 사용 (0) | 2023.01.28 |
[ C ] 겨울방학동안 C 포인터/ 구조체/ 동적메모리 개념 확실하게 익히기 | 자료구조 학습전 갖추어야할 베이스지식 (0) | 2023.01.28 |