고양이와 코딩
포인터 본문
포인터!
c언어에서 가장 이해하기 어렵고(...) 메모리 관리에서 아주 중요한 요소이다
컴퓨터의 메모리에 보다 직접적으로 접근해서, 이를 제어할 수 있도록 도와주는 도구!
C언어에서 포인터를 정의하는 방법
(포인터에 주소값이 저장되는 데이터의 형) * (포인터의 이름);
(포인터에 주소값이 저장되는 데이터의 형) * (포인터의 이름);
int *p;
int* p;
포인터를 정의 한 후, 주소값을 집어넣는 방법
& 연산자 사용 (and 연산자와의 차이점은, &를 사용할때 피연산자가 두 개 있어야 한다는 점!)
&a
#include <stdio.h>
int main() {
int a;
a = 2;
printf("%p \n", &a);
return 0;
}
// 0x16fdfe038
16진수 형태(%p)로 출력
16자리가 아닌 이유는, 단순히 앞의 0이 잘렸기 때문
int변수 a는, 메모리 상에서 0x16fdfe038을 시작으로 8바이트의 공간을 차지하고 있다! (64비트이기 때문)
#include <stdio.h>
int main() {
int *p;
int a;
p = &a;
printf("p의 값: %p \n", p);
printf("p가 가리키는 값: %d \n", *p);
return 0;
}
* 연산자
- 포인터는 특정한 데이터의 주소값을 보관한다. 이 때 포인터는 주소값을 보관하는 데이터의 형에 * 를 붙임으로써 정의.
& 연산자로 특정한 데이터의 메모리 상의 주소값을 알아올 수 있다!
#include <stdio.h>
int main() {
int *p;
int a;
p = &a;
a = 2;
printf("a 의 값 : %d \n", a);
printf("*p 의 값 : %d \n", *p);
return 0;
그러니까 이 경우, p는 a의 주소값을 가리키고, *p는 다시 그 주소값에 위치한 데이터를 가리키기 때문에 2가 된다.
포인터에 타입이 존재하는 이유
int a;
pointer *p;
p = &a;
*p = 4;
위 코드에서 a를 위해 4바이트의 공간을 마련해줬고 p를 위해 8바이트의 공간을 마련했습니다. 그리고 p에 a의 주소값을 전달했지만,
*p = 4 문장에서 포인터는 a가 메모리에서 차지하는 모든 주소의 위치가 들어있는것이 아니라, 시작 주소만 들어가 있기 때문에 *p!
에서 컴퓨터는 메모리를 얼마만큼 읽어들여야 할지 알 수 없습니다!
int a;
int *p;
p = &a;
*p = 4;
하지만 이렇게 *p의 타입을 int라고 지정해준다면, 이 포인터는 int 데이터를 가리킨다는 사실을 알고 시작 주소로부터 4바이트를 읽어서 값을 바꾸게 됩니다 ㅎㅎ
* => 특정 데이터의 시작 주소값에 들어있는 데이터 값을 알아낸다
& => 특정 데이터의 시작 주소값을 가리킨다
int **a;
특정 데이터의 값을 가리키는 포인터의, 포인터이므로
가리키는 포인터의 주소값이 저장되고(1차로) 그 포인터 또한 특정 데이터를 가리키고 있다.
'C' 카테고리의 다른 글
포인터 진짜 짜증남 (0) | 2024.06.15 |
---|---|
function (1) | 2024.06.09 |
비트 연산 (0) | 2024.05.10 |
[씹어먹는 C 언어] 반복문 - 삼각형 그리기 (0) | 2024.03.17 |
[프로그래머스] 3월16일 ~ (0) | 2024.03.16 |