카테고리 없음

[c언어] 포인터란?

제이G 2023. 6. 19. 13:13

포인터란 메모리에서 메모리를 가리키기 위한 개념이다.

 

선언부

&: ~~의 주소

*: ~~의 주소를 저장하는 포인터 변수

#include <stdio.h>

int main(void)
{
	int n = 50;
	int *p = &n;    //&: 's address
	int p2 = &n; // compile erorr: 주소값을 포인터변수가 아닌 변수에 저장

	printf("n: %d, n's address: %d", n, p);
	printf("n: %d, n's address: %d", n, (int) p); // compile error: 포인터변수:8byte. int:4byte 서로 다른 크기의 자료형
}
  • n의 주소(&n)는 반드시 포인터변수 (자료형 *)에 저장해야 한다.
    포인터가 아닌 일반 변수에 저장하면 (ex. int p = &n;), 컴파일에서 오류 발생. (&n은 n의 주소값인데 너 지금 주소값을 int 변수에 저장하고 있어)
  • 포인터변수의 크기: 8byte
    포인터 변수의 크기는 8byte이다. 따라서, 포인터 변수를 int(4byte)로 타입 캐스팅하면 컴파일 오류가 발생한다. 자료형의 크기가 서로 다르기 때문

  • 포인터변수에 저장된 주소값(16진수)를 보려면 %p를 사용해야 한다.
    (포인터변수에 저장된 주소값(16진수)의 10진수를 보려면 8byte에 해당하는 %O를 사용하면 됨)

  • 포인터에 저장된 주소값은 매번 달라진다.
    최근 컴퓨터는 보안상 문제로 메모리를 여기저기로 바꾸기 때문.

 

사용부

*p: p에 저장된 주소로 “가라”

#include <stdio.h>

int main(void)
{
	int n = 50;
	int *p = &n;

	printf("n: %d\n", *p); //p에 저장된 주소로 "가라"
	//print: 50
}
  • 포인터는 추상화를 위해 사용
  • n의 주소가 뭔지 궁금하지 않음. 접근만 하면 됨. 실제 주소는 신경 쓸 필요가 없어진 것.

 


포인터 정리

  • 선언부에서 &n은 n의 주소(16진수) 의미한다.
  • 선언부에서 *p는 주소를 저장하는 포인터를 의미한다.
  • 주소는 반드시 포인터에 저장해야 한다.
  • 일반 자료형으로 선언하면 컴파일 오류가 발생한다.
  • 포인터의 크기는 일반적으로 8byte이다.
  • 포인터를 자료형 크기와 다른 자료형으로 캐스팅하면 컴파일 오류가 발생한다.
  • 포인터는 메모리에서 메모리를 가리키는 추상화를 위해 사용된다.
  • 이를 통해 강력한 자료구조를 만들 수 있다.
  • *p는 p의 주소로 가라는 의미이다.
  • %p는 포인터의 주소값을 출력한다.