C언어 복습1 - 포인터

seri·2021년 3월 15일
0

C언어 공부

목록 보기
1/2

포인터와 메모리

int * ptr

  • 포인터는 메모리 공간을 만들어 변수의 주소를 저장하는 역할을 한다.
  • * 연산자를 사용하며, 저장할 변수의 자료형에 따라 포인터의 자료형도 바뀐다.
  • int * ptr 는 pointer to int 라고 부르며, 말 그대로 int 자료형 정수의 메모리 주소를 가리키는 포인터라는 뜻을 가지고 있다.
  • 포인터의 크기는 32비트 컴퓨터에서 4바이트, 64비트 컴퓨터에서 8바이트다.
  • 포인터는 메모리 공간을 가리키는 역할이기 때문에, 그 자체로 변수를 대입해 초기화하거나 사칙연산 등의 연산을 할 수 없다.
  • 즉, 포인터를 하나의 자료형으로 본다면, int *ptr에 대입할 수 있는 변수는 '주소'를 가리키는 변수인 것이다. 이를 나타내는 방법으로 '&' 연산자를 사용한다. 이는 address to int 라고 부르며, pointer to int 와 본질적으로 같다.
	int num = 10;
    	int *ptr = #
        printf("address of num: %p\n", &num);
        printf("value of ptr: %p\n", ptr);
        // 위 두 printf 값은 동일한 메모리 주소가 나온다.
  • 포인터의 주소가 아닌 '저장된 값'을 가져오고 싶다면, 역참조 연산자인 '*'를 사용하면 된다.
  • *ptr = num; 과 같이 쓸 수 있으며, ptr이 가리키는 메모리 안에 저장돼 있는 값을 가져오는 것이다.

void *ptr

  • void 포인터는 자료형이 정해지지 않은 포인터다.
  • int, double, float, long long 등 모든 자료형과 호환가능하다.
  • 하지만 자료형이 정해지지 않은 포인터이니만큼 메모리의 크기를 알 수 없어 역참조를 할 수 없다.

이중 포인터

  • *연산자를 n번 쓰면 n중 포인터가 되고, 차례대로 pointer->pointer->pointer->...->num 을 가리키게 된다.
  • 이중 포인터의 값에 접근하기 위해 역참조 연산자를 쓸 때도 두 개를 써야 한다.

malloc

  • 메모리를 동적으로 할당할 때 사용하는 메모리 생성 함수로, <stdlib.h> 헤더 파일에 포함돼있다.
  • malloc 함수의 매개변수로는 할당할 메모리의 크기가 들어가고, 메모리를 사용하고 난 뒤, 꼭 free 함수를 사용해 메모리를 해제해줘야 한다.
  • malloc 함수를 통해 할당된 메모리는 'heap' 영역에 저장된다 (변수는 'stack').
	int * ptr1 = malloc(sizeof(int));
    	char * ptr2 = malloc(sizeof(char)*4+1);
    	int num = 10;
        ptr1 = &num;
        ptr2 = "dope";
        free(ptr1);
        free(ptr2);

memset

  • 메모리를 특정 값으로 채울 때 사용하는 함수로, <string.h> 헤더 파일에 포함돼있다.
  • memset(ptr, 0, sizeof(int)) 등과 같이 사용한다.

NULL potiner

  • 아무 것도 가리키지 않는 포인터를 널 포인터라고 하며,
    int * ptr = NULL; 과 같이 선언/초기화 한다.
profile
맨 땅에 헤딩중

0개의 댓글