변수는 어떤 값을 저장하기 위한 메모리 공간이다.
그러면 포인터변수는 무엇일까?
포인터 변수는 "주소 값"이다.
설명은 아랫 코드에 달았다.
#include <stdio.h>
int main(void) {
int a=1; //a변수에 1을 대입한다.
int* pa=&a; // 포인터형 변수pa에 주소값을 대입한다.
printf("변수 a의 값 : %d\n", a);
*pa=2; //pa주소 값의 역참조. 역참조 되었으니 그 공간을 의미한다. 여기서는 a공간에 2를 넣는다라는 의미이다.
printf("역참조를 이용해서 a의 값을 바꾼 후의 a 값 : %d\n", a);
printf("a 변수의 실제 메모리상에서의 위치(주소) %p\n", &a);
printf("실제 주소 값을 입력 한 후 그 주소에서의 값 출력 : %d\n",*(unsigned int*)0x000000000061fe14); // (1)
// 처음에는 변수 a공간의 주소값을 모른다. 그러므로 윗 행을 코멘트 처리 한 후, 실행해서 출력창에서 그 값을 복사해 온 후 코멘트를 해제한다.
// 캐스팅 연산자 앞에 *(역참조)를 붙였다. 즉, 주소의 값을 다루겠다는 의미이다.
// (unsigned int)가 아닌 (unsigned int*)을 사용한다.
// (unsigned int)라는 것은 오른쪽 내용이 부호없는 정수로 해석하라는 의미이다.
// (unsigned int*)가 되면 오른쪽 내용이 포인터(주소)라는 것으로 바뀐다. 또는 포인터(주소)로 변환된다.
printf("pa의 주소를 출력한다.: %p\n", pa); // pa가 주소임을 알 수 있다.
printf("a의 값을 직접 주소를 입력해서 구한다. : %d\n",*(unsigned int*)pa); // (2)
printf("a의 값을 포인터 변수 pa에 역참조 해서 구한다. : %d\n",*pa); // (3)
//결론! (1), (2) 및 (3)을 보면 pa는 주소 값임을 알 수 있다.
return 0;
}
위 내용을 개발툴에 넣고 빌드한 후 실행해보자.
E:\shkim\temp>main
변수 a의 값 : 1
역참조를 이용해서 a의 값을 바꾼 후의 a 값 : 2
a 변수의 실제 메모리상에서의 위치(주소) 000000000061FE14
실제 주소 값을 입력 한 후 그 주소에서의 값 출력 : 2
pa의 주소를 출력한다.: 000000000061FE14
a의 값을 직접 주소를 입력해서 구한다. : 2
a의 값을 포인터 변수 pa에 역참조 해서 구한다. : 2
E:\shkim\temp>
일반 변수는 우리가 변수가 저장되는 번지를 이용해서 그 값의 저장소 역할 만을 담당한다.
그러나 우리가 포인터 변수를 사용한다고 하면, 일단은 우리는 그 공간을 이용해서 특정 작업을 할 목적을 가지고 포인터 변수를 선언한다는 것이다.
도입부의 코딩을 보면 변수 a를 선언하고 포인터 변수 pa를 선언하였다. 즉, pa를 가지고 변수 a를 다루겠다는 의미이다.
'헝클어진 알고리즘' 카테고리의 다른 글
AWS에서 말하는 인스턴스란? (1) | 2024.10.30 |
---|---|
CRC(Cyclic Redundancy Check) 알고리즘 (0) | 2024.06.14 |
빅오 표기법(Big-O notation) (0) | 2023.01.31 |
UML(Unified Modelling Language) (0) | 2021.11.20 |
함수의 파라미터와 아규먼트의 차이 (0) | 2021.09.24 |