포인터 변수란?/선언 방법 / & 연산자
C언어는 하드웨어와 친합니다. 그래서 메모리에 접근할 수 있습니다.
이 점을 양날의 검처럼 잘 활용하면 강력한 일을 할 수 있고, 사고를 칠 수 있으니 잘 사용해야 합니다.
그럼 C언어는 어떻게 메모리에 접근할 수 있을까요? 바로 포인터를 이용하여 메모리에 직접 접근합니다.
이해를 위해 일단 변수 num1 에 데이터 10을 대입했다고 가정하겠습니다.
아래와 같은 그림이 그려지겠지요.
int형 변수 num1은 Ox12FF76(주소)에 할당되어 있습니다.
그럼 코드상으로 어떻게 주소값을 알아낼 수 있을까요?
바로 주소 연산자 &( 비트 연산자 & 아님 ) 를 사용하면 됩니다.
&는 피연산자의 주소 값을 반환하는 연산자입니다.
그래서 num1이란 변수가 있으면 &num1은 그 변수가 위치한 메모리 주소입니다.
C언어로 작성한 코드를 보겠습니다.
#include <stdio.h>
int main()
{
int num1 = 10;
printf("%p\n", &num1); // 008AF7FC: num1의 메모리 주소를 출력
// 컴퓨터마다, 실행할 때마다 다름
return 0;
}
위 코드를 실행하면 아래 결과가 뜹니다.
바로 num1 변수의 메모리 주소값을 구한 것입니다.
메모리 주소는 16진수 형태이며 printf에서 서식 지정자 %p를 사용하여 출력합니다.
물론 16진수로 출력하는 %x, %X를 사용해도 됩니다.
이때 메모리 주소는 고정된 것이 아니라 컴퓨터마다, 실행할 때마다 달라집니다.
그럼 변수의 메모리 주소는 어디에 저장해야 할까요?
C언어에서 메모리 주소는 포인터(pointer) 변수에 저장합니다.
< 포인터 변수 선언 방법 >
자료형 뒤에 * ( Asterisk, 애스터리스크)를 붙입니다. *가 어디에 있든 차이는 없고 모두 같은 뜻입니다.
int* numPtr; // 자료형 쪽에 *을 붙임
int * numPtr; // 자료형과 변수 가운데 *를 넣음
int *numPtr; // 변수 쪽에 *을 붙임
포인터 변수를 선언했으면 다음과 같이 &로 변수의 주소를 구해서 포인터 변수에 저장할 수 있습니다.
numPtr = &num1; // num1의 메모리 주소를 포인터 변수에 저장
여기서 주의해야 할 점은 포인터 변수 선언할 때 쓰는 *와 역 참조 연산자 *를 헷갈리면 안됩니다.
역 참조와 관련해서는 다음 글에서 다루겠습니다.
-----------------------------------
-----------------------------------
'컴퓨터 공학 > C, C++' 카테고리의 다른 글
[ C ] 포인터 이해하기3_포인터와 배열의 차이 (400) | 2020.07.18 |
---|---|
[ C ] 포인터 이해하기2_참조와 역참조/ 역 참조 연산자 * (611) | 2020.07.18 |
[ C ] 메모리 이해하기11_동적 메모리의 소유권 문제 (398) | 2020.07.17 |
[ C ] 메모리 이해하기10 _정적 vs 동적 메모리 (398) | 2020.07.17 |
[ C ] 메모리 이해하기9 _realloc()의 메모리 누수 문제, 해결책은? (398) | 2020.07.16 |
댓글