1 분 소요


▶ 포인터란?

  • Pointer(포인터)
    • 메모리의 주소값을 저장하는 변수
    • char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다.


▷ 포인터 선언과 초기화

  • p의 a값을 저장해보자!

    • a의 주소값을 저장하기 위해선 &(앰퍼샌드)연산자를 사용한다

      • 즉, a의 값이 아닌 a의 주소 값을 저장할 수 있는 것이다.


    • 주소값을 저장하는 변수라는 뜻으로 *연산자를 사용한다. -> 포인터

      • 즉, 정수가 아니라 int형의 주소를 저장할 수 있는 것이다.
      • 주소값을 저장하기 위해 당연히 메모리가 할당 될 것이다!
    int *ptr = &a; // 포인터 선언과 초기화 동시에
    


  • 예시

    • 아래와 같을 때, ptr은 n을 참조하는 상황이다.
    int n = 100;   // 변수의 선언
    
    int *ptr = &n; // 포인터의 선언
    ptr = &a; // 포인터 초기화
    

    • 위와 같은 상황에서 n, ptr, *ptr을 출력하면 어떤 값이 나올까?
      • n : 100
      • ptr : 0x12(n의 시작 주소)
      • *ptr(역참조) : 100


▷ * 연산자

* 연산자가 헷갈린다..! 언제 쓰이는 거지?

*의 용도 : 연산자, 포인터, 역참조

곱하기 포인터 역참조
2 * p; int * p
p는 int형의 주소를 저장하는 포인터
*p
* 연산자를 중심으로 피연산자가 수치값이나 변수로 이루어짐 좌측 피연산자에 무조건 자료형이 있음 단항 연산자로 쓰일 때 포인터가 가리키는 메모리에 접근하는 역참조로 쓰임
2 곱하기 p p는 int형의 주소를 저장하는 포인터⭐ p 역참조


띄어쓰기 따위 의미 없음!

int* p; int *p; int * p; int*p;


포인터는 64bit 시스템에서 모든 자료형이 8bit인데 왜 포인터에 자료형이 있을까?

  • 포인터가 갖고 있는 주소 값은 메모리의 시작 주소 값만 갖고 있기 때문에 포인터 역참조를 하기 위해 자료형이 필요하다.


✏️문제

포인터를 사용하여 a와 b의 출력 값을 바꿔보자!

#include <stdio.h>

void swap(int* a, int* b) {
	int temp;
	temp = * a;
	*a = *b;
	*b = temp;
}

int main()
{
	int a=5;
	int b=10;
	swap(&a, &b);
	printf("%d %d", a, b);
}




📎참조

  • https://www.tcpschool.com/c/c_pointer_intro
  • https://www.youtube.com/watch?v=bz63_WWtKc4

태그:

카테고리:

업데이트:

댓글남기기