본문 바로가기
컴퓨터 공학/C, C++

[ C ] 포인터 이해하기1_포인터 변수란?/선언 방법 / & 연산자

by hahehohoo 2020. 7. 17.
반응형

 

포인터 변수란?/선언 방법 / & 연산자

 

 

 

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언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

 

반응형


댓글