** C에서

Jagathish 2023년10월12일
  1. C의 변수에 대한 메모리 할당
  2. C 포인터
  3. C에서 포인터에 대한 포인터(**)
** C에서

이 튜토리얼에서는 포인터에 대한 포인터(이중 포인터 또는 **)를 사용하여 다른 포인터 변수의 주소를 저장하는 방법을 설명합니다.

C의 변수에 대한 메모리 할당

변수를 생성할 때 값을 저장하기 위해 해당 변수에 할당된 특정 메모리 블록이 있습니다. 예를 들어 char 변수 ch와 값 a를 만들었습니다. 내부적으로 1바이트의 메모리가 ch 변수에 할당됩니다.

메모리 할당

C 포인터

C 프로그래밍에서 포인터는 다른 변수의 주소를 저장하는 변수입니다. 해당 주소에 있는 값에 액세스하려면 *를 사용합니다.

포인터 그림

#include <stdio.h>

int main() {
  char ch = 'a';    // create a variable
  char *ptr = &ch;  // create a pointer to store the address of ch

  printf("Address of ch: %p\n", &ch);  // prints address
  printf("Value of ch: %c\n", ch);     // prints 'a'

  printf("\nValue of ptr: %p\n", ptr);  // prints the address of a
  printf("*ptr(value of ch): %c\n",
         *ptr);  // Prints Content of the value of the ptr
}

출력:

Address of ch: 0x7ffc2aa264ef
Value of ch: a

Value of ptr: 0x7ffc2aa264ef
*ptr(value of ch): a

위의 코드에서,

  • char 변수 ch를 만들고 문자 a를 값으로 할당했습니다.
  • char 포인터 ptr을 만들고 변수 ch의 주소를 저장했습니다.
  • ch의 주소와 값을 인쇄했습니다.
  • ptr의 값을 인쇄하면 ptr의 값은 ch의 주소가 됩니다.
  • *ptr을 사용하여 ch의 값을 출력합니다. ptr의 값은 변수 ch의 주소이며 해당 주소에 'a' 값이 있으므로 인쇄됩니다.

C에서 포인터에 대한 포인터(**)

변수의 주소를 저장하기 위해 포인터를 사용합니다. 마찬가지로 포인터의 주소를 저장하려면 **(포인터에 대한 포인터)를 사용해야 합니다. **는 다른 포인터의 주소를 저장하는 포인터를 나타냅니다.

포인터 변수에 대한 포인터에 있는 값을 인쇄하려면 **를 사용해야 합니다.

포인터 대 포인터 그림

#include <stdio.h>

int main() {
  char ch = 'a';           // create a variable
  char *ptr = &ch;         // create a pointer to store the address of ch
  char **ptrToPtr = &ptr;  // create a pointer to store the address of ch

  printf("Address of ch: %p\n", &ch);  // prints address of ch
  printf("Value of ch: %c\n", ch);     // prints 'a'

  printf("\nValue of ptr: %p\n", ptr);   // prints the address of ch
  printf("Address of ptr: %p\n", &ptr);  // prints address

  printf("\nValue of ptrToPtr: %p\n", ptrToPtr);  // prints the address of ptr
  printf("*ptrToPtr(Address of ch): %p\n",
         *ptrToPtr);  // prints the address of ch
  printf("**ptrToPtr(Value of ch): %c\n", **ptrToPtr);  // prints ch
}

출력:

Address of ch: 0x7fffb48f95b7
Value of ch: a

Value of ptr: 0x7fffb48f95b7
Address of ptr: 0x7fffb48f95b8

Value of ptrToPtr: 0x7fffb48f95b8
*ptrToPtr(Address of ch): 0x7fffb48f95b7
**ptrToPtr(Value of ch): a

위의 코드에서,

  • char 변수 ch를 만들고 문자 a를 값으로 할당했습니다.
  • char 포인터 ptr을 만들고 변수 ch의 주소를 저장했습니다.
  • 포인터 ptrToPtr에 대한 char 포인터를 만들고 변수 ptr의 주소를 저장했습니다.
  • ptr은 변수 ch의 주소를 값으로 갖고 ptrToPtr은 포인터 ptr의 주소를 값으로 갖습니다.
  • *ptrToPtr과 같이 ptrToPtr을 역참조하면 ch 변수의 주소를 얻습니다.
  • **ptrToPtr과 같이 ptrToPtr을 역참조하면 ch 변수의 값을 얻습니다.

기억할 점

ptrToPtr의 주소를 저장하려면 다음을 생성해야 합니다.

char ***ptrToPtrToPtr = &ptrToPtr;
printf("***ptrToPtrToPtr : %c\n", ***ptrToPtrToPtr);  // 'a'

관련 문장 - C Pointer