1 minute read

CS50 강의 외 보충

배경

CS50 강의를 듣고 난뒤에 부족했던 부분을 보충학습한 내용입니다.

다양한 포인터

Void 포인터

  • 타입을 명시하지 않은 포인터입니다. 모든 타입을 가르킬 수 있으나 포인터 연산이나 메모리 참조와 같은 작업은 할 수 없습니다. 사용할 때에는 사용하고자 하는 타입으로 명시적 선언 후에 사용해야 합니다.

NULL 포인터

  • 0이나 NULL을 대입하여 초기화한 아무것도 가리키지 않는 포인터라는 의미입니다.

이중 포인터

  • 이중 포인터(포인터의 포인터): 포인터 변수의 주소를 가르키는 변수를 이중 포인터라고 합니다.
      int num = 10;              // 변수 선언
    
      int* ptr_num = #       // 포인터 선언
    
      int** pptr_num = &ptr_num; // 포인터의 포인터 선언  
    
      printf(num); // 10
     
      printf(*ptr_num); //10
    
      printf(**pptr_num);  //10
    

    이중 포인터는 다차원 배열에서 활용할 수 있습니다.

포인터 배열

포인터 배열(Array of pointers)

포인터들을 원소로 가지는 배열을 의미힙나다.
만약 포인터를 원소로 가지는 배열이 있고, 각 배열의 원소인 포인터들이 또 다른 배열을 가리킨다면 해당 포인터 배열은 다차원 배열의 형태입니다.

다차원 배열

배열의 요소로 배열을 가지는 배열입니다.

type var_name[row_len][col_len]

같이 선언하며, 메모리는 입체적으로 존재하는게 아닌 선형적인 공간이므로 사실상 col개의 변수가 row개 만큼 반복되는 선형 구조로 저장됩니다. 그래서 같은 주소의 메모리를 var_name[r][c]로도 접근 할 수 있고, var_name[r*c]로도 접근할 수 있습니다.

출처: tcpschool

배열 포인터

베열을 가르킬 수 있는 포인터를 의미합니다. 이전 글에서 살펴 보았듯, 배열은 포인터로도 접근이 가능하며 이때 배열의 이름 자체는 배열이 시작하는 원소의 주소를 가지고 있습니다. 배열의 이름이 갖는 주소를 저장한 포인터를 배열 포인터라고 합니다.

출처: tcpschool
int arr[2][3] =             // 배열의 선언

{

    {10, 20, 30},

    {40, 50, 60}

};

int (*pArr)[3] = arr;       // 배열 포인터의 선언  

 

printf("%d\n", arr[1][1]);  // 배열 이름으로 참조

printf("%d\n", pArr[1][1]); // 배열 포인터로 참조

Leave a comment