본문 바로가기
개념/혼자 공부하는 C언어

chapter 15) 포인터와 이중 포인터의 관계

by kiseno 2024. 9. 15.
728x90
반응형
SMALL
#include <stdio.h>

int main(void){
    int a = 10;
    int *pi, **ppi;

    pi = &a, ppi = &pi;

    printf("----------------------------------------------\n");
    printf("변수        변숫값      &연산       *연산       **연산\n");
    printf("----------------------------------------------\n");
    printf(" a%10d%10%10u\n", a, &a);
    printf(" pi%10u%10u%10d\n",pi, &pi, *pi);
}

### 코드 설명

이 프로그램은 변수, 포인터, 이중 포인터의 개념을 설명하기 위해 작성되었습니다. 변수 `a`, 포인터 `pi`, 그리고 이중 포인터 `ppi`를 사용하여 각각의 값을, 주소, 그리고 간접 참조를 통한 값에 접근하는 방법을 보여줍니다.

int a = 10; // 정수형 변수 a를 선언하고 10으로 초기화합니다.
int *pi, **ppi; // 정수형 포인터 pi와 이중 포인터 ppi를 선언합니다.

pi = &a, ppi = &pi; // pi에는 a의 주소를, ppi에는 pi의 주소를 할당합니다.


### 출력 설명

- `printf("변수        변숫값      &연산       *연산       **연산\n");`를 통해 테이블의 헤더를 출력합니다. 여기서 각 열은 변수의 이름, 변수의 값, 변수의 주소(& 연산), 포인터가 가리키는 값(* 연산), 그리고 이중 포인터가 가리키는 값(** 연산)을 의미합니다.

- `printf(" a%10d%10%10u\n", a, &a);`와 `printf(" pi%10u%10u%10d\n",pi, &pi, *pi);`는 각각 변수 `a`와 포인터 `pi`의 정보를 출력하려고 시도합니다. 그러나 이 코드는 몇 가지 문제가 있습니다:
  1. `%10%10u`와 같은 부분은 올바른 형식 지정자가 아닙니다. 아마도 주소를 출력하려는 의도였을 텐데, 주소를 출력하기 위해서는 `%p` 형식 지정자를 사용해야 하고, 해당 변수 앞에 `(void *)` 캐스팅이 필요합니다.
  2. 이중 포인터 `ppi`에 대한 출력이 누락되었습니다. 이중 포인터는 `**연산`을 통해 변수 `a`의 값을 간접적으로 접근할 수 있게 해줍니다.

올바르게 수정된 코드의 출력 부분은 다음과 같아야 합니다:

printf(" a%14d%14p\n", a, (void*)&a);
printf(" pi%16p%14p%11d\n", (void*)pi, (void*)&pi, *pi);
printf(" ppi%14p%14p%13d\n", (void*)ppi, (void*)&ppi, **ppi);


이 출력은 각 변수, 포인터, 이중 포인터의 값을, 주소, 그리고 간접 참조 값을 명확하게 보여줍니다. `*연산`은 포인터가 가리키는 값에 접근할 때 사용되고, `**연산`은 이중 포인터가 가리키는 값을 접근할 때 사용됩니다.

728x90
반응형
LIST