🔰 데이터의 주소값이란? 🔰
해당 데이터가 저장된 메모리의 시작 주소를 의미
C 언어에서는 이런 주소값을 1바이트 크기의 메모리 공간으로 나누어 표현
예를 들어 int 형 데이터는 4바이트를 가지지만, int 형 데이터의 주소값은 시작 주소 1바이트 만을 가리킴
🎯 포인터란? 🎯
C 언어에서 많이들 어려워하는 개념으로 메모리의 주소값을 저장하는 변수 (포인터 변수)
포인터는 주소값을 저장함
int 형 변수가 int n = 10; 이렇게 변수를 선언하는 것 처럼,
포인터는 int *p = &n; (n의 주소값을 p에 저장) 이런 형식으로 포인터를 선언한다.
참고로 포인터 변수는 메모리에서 변수의 위치를 나타내는 주소를 다루는 변수이므로, 그 크기는 일반적으로 CPU에 따라 결정된다.
따라서 32bit CPU에서 1word의 크기가 4바이트 이므로, 포인터 변수의 크기 또한 4바이트 이다.
(이런 이유로 64bit CPU에서는 포인터 변수의 크기가 8바이트이다.)
💜 포인터 연산자 💜
C언어에서 포인터와 연관되어 사용하는 연산자는 아래 2가지 이다.
1. 주소 연산자 (&)
2. 참조 연산자 (*)
주소 연산자는 변수의 이름 앞에 사용하여 해당 변수의 주소값을 반환하며
기호는 ' & ' (ampersand), 번지 연산자라고도 불린다.
참조 연산자는 포인터의 이름 앞이나 주소 앞에 사용하여 포인터에 가리키는 주소에 저장된 값을 반환한다.
이처럼 C언어에서 ' * ' 기호는 곱셈 뿐만 아니라 포인터의 선언 시나 메모리에 접근할 때도 사용한다.
💛 포인터의 선언 💛
포인터는 일반적으로 다음과 같이 선언한다.
타입* 포인터이름;
타입이란 포인터가 가리키고자 하는 변수의 타입을 명시하는 것이다.
포인터 이름은 포인터가 선언된 후에 포인터에 접근하기 위해 사용된다.
포인터를 선언하고 참조 연산자를 사용하기 때문에 반드시 먼저 초기화 되어야 하다.
그렇지 않으면 의도하지 않은 메모리의 값을 변경하기 때문이다.
따라서 C 컴파일러는 초기화하지 않은 포인터에 참조 연산자를 사용하면 오류를 뱉어낸다.
그렇기 때문에 아래와 같이 선언과 동시에 초기화를 하는 것이 좋다.
타입* 포인터이름 = &변수이름;
타입* 포인터이름 = 주소값;
++ 참고로 *의 위치는 2가지 모두 가능하다. int* n = 2; 와 int *n = 2; 모두 같은 의미이다.
💚 포인터의 참조 💚
C 언어에서 선언된 포인터는 참조 연산자를 사용해서 참조할 수 있다.
아래의 코드는 포인터의 주소값과 함께 포인터가 가리키고 있는 주소값의 데이터를 참조하는 예제이다.
int x = 8;
int *p1 = &x;
int *p2 = & p1;
만약 x의 주소값이 0x12이고 p1의 주소값이 0x25라면
printf(p1); 의 결과값은 0x12가 되고
printf(p2); 의 결과값은 0x25가 된다.
포인터는 앞서 말한 것 처럼 내가 참조할 주소값의 데이터의 타입을 따라 가는데,
만약 int n = 1; 과 char c = 'a'; 가 있다고 할 때
n의 주소값을 가지는 p1과 c의 주소값을 가지는 p2는 각각 이런 식이 된다.
int *p1 = &n;
char *p2 = &c;
<참고 자료>
http://www.tcpschool.com/c/c_pointer_intro
https://dojang.io/mod/page/view.php?id=275
'개인공부 > language' 카테고리의 다른 글
[GO] 모듈과 패키지 (0) | 2024.11.05 |
---|---|
[JAVA] ArrayList가 비어있는지 확인 하기 (0) | 2024.02.27 |