[ 프로그래밍 기초 ] 포인터

THIST·2025년 5월 16일
post-thumbnail

포인터

포인터의 개념

포인터(pointer)는 메모리 주소를 저장하는 변수이다. 쉽게 말해, 주소를 가리키는 변수이다.

이게 뭔 소리일까?

걍 이거다.


그렇다.....

프로그래밍 관점에서 그냥 가리키는 그 행위 자체를 포인터(Pointer)라고 말해주고 싶다.

우리에게 집이 있듯이 그 집으로 가기 위해서는 주소가 필요하다.

그 주소가 바로 포인터(Pointer)라고 볼 수 있다.

그리고 프로그래밍 관점에서 집 그 자체를 우리는 값이라 볼 수 있다.

지금 손으로 아무 사물이나 가르켜보자.

지금 가리키고 있는 손은 포인터(Pointer)가 될것이고,

가리키고 있는 대상 그 자체는 값(Value)이 되는것이다.

 
일반적인 변수는 값을 저장하는 반면, 포인터 변수는 값을 저장하는 변수의 메모리 주소만을 저장한다.

메모리와 변수

먼저 메모리에 대해 간단하게 이해해보자.

프로그램이 실행될 때, CPU는 메모리에서 데이터를 읽고 처리한다.

예를 들어, int a = 10; 이라는 코드가 있을 때, a는 그림과 같이 특정 위치에 10이라는 값을 저장하게 된다. 그리고 이러한 메모리의 각 위치는 고유한 주소를 가지고 있게 된다.

이 때 a는 값인 10을 저장하는 변수이고, 그 값이 저장된 메모리 주소를 포인터라고 한다.

포인터의 역할

포인터의 역할은 결국 ‘주소를 가리키는 것’이다. 포인터를 통해 변수의 메모리 주소를 알 수 있으며, 이 주소를 이용하여 간접적으로 변수의 값을 다룰 수 있게 된다.

포인터의 기본 구성

1. 포인터 변수 선언
포인터 변수를 선언할 때는 타입 뒤에 를 붙여서 선언한다. 이 때 는 포인터 변수임을 나타내는 키워드이다.

int* ptr; // int형 포인터

2. 주소 연산자
&는 주소 연산자로, 변수의 메모리 주소를 구할 때 사용한다.

int a= 10;
int* ptr = &a;

3. 역참조 연산자
*는 역참조 연산자로, 포인터가 가리키는 주소에 저장된 값을 가져오거나 변경할 때 사용한다.

int a=10;
int* ptr = &a;
std:cout << *ptr << std::endl;

포인터를 이용한 값 수정

포인터를 이용하여 변수의 값을 간접적으로 변경할 수 있다.

int a = 10;
int* ptr = &a;  
*ptr = 20;  
std::cout << *ptr << std::endl;  

문제. 결과값은 어떻게 나올까?

#include<iostream>

int main(void) {
	int num = 10;
    int* ptr = &num;
    
    std::cout << *ptr << std::endl;
    std::cout << &ptr << std::endl;
    std::cout << ptr << std::endl;
    
    return 0;

대략적으로 뭐가 출력되는지만 알면 된다.

profile
하고 싶은 개발을 지향하는 삶을 추구합니다:D

1개의 댓글

comment-user-thumbnail
2025년 5월 28일

글 잘봤습니다. 포인터가 C언어에 있어서 최대 진입장벽인데 잘 풀어서 설명해주신 것 같네요.
마지막 문제는 ptr에 &num 자체를 넣어서 풀면 의미가 명확해지네요. 꼼수긴 한데 *와 &는 서로 상쇄가 된다.를 이용하면 그나마 수월할 것 같습니다.

답글 달기