포인터가 아닌 변수에 %p서식을 통해 나오는 결과에 대하여

조회수 712회

포인터 단원을 공부하고 있는 학도입니다.

제가 무지한 나머지 이해가 잘 안되는 부분이 있어 선배님들께 가르침을 얻고자 글을 올렸습니다.

먼저, 제 글을 봐주신 것에 정말 감사드리며 질문 올리겠습니다.

include

int main(){

int a;
int* pa;

pa = &a;
a = 1;

printf("a의 무엇?: %p\n", a);
printf("a의 주소값: %p\n", &a);
printf("a의 value : %d\n\n", a);

printf("pa의 주소값 : %p\n", pa);
printf("pa의 주소값? : %p\n", *pa);


return 0;

}

실행결과

a의 무엇: 0x1

a의 주소값: 0x7ffd407638b8

a의 value : 1

pa의 주소값 : 0x7ffdd2e52c58 pa의 주소값? : 0x1

*

질문 드립니다.

질문1. ***변수 a가 포인터가 아님에도 %p서식을 통해 출력된 값이 의미하는 바가 있는지 여쭙고싶습니다.***

질문2. pa라는 같은 포인터임에도 불구하고 pa를 %p서식을 통해 출력한 결과와 *pa를 %p 서식을 출력한 결과가 다른 이유가 있는지 여쭙고싶습니다.

질문3. ***위 두 질문을 이해했다면 제가 드릴 질문인가 싶지만, 변수 a가 %p서식을 통해 출력된 값과 포인터 *pa가 %p서식을 통해 출력된 값이 왜 같은지 여쭙고 싶습니다.***

감사드립니다.

바쁘신 시간 할애하셔서 제 글 읽어주셔서 정말 감사드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 아하...제가 한 일은 있어서는 안되는 일이군요.

    말을 하면서 지켜야 할 문법을 안 지키는 일이었네요.

    서식의 형태가 맞지 않으면 그것은 정의되지 않은 것으로 간주하네요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • printf 함수는 서식에 맞추어 문자열을 출력하는 함수입니다.

    변환 문자 %p는 주소(포인터) 형태로 숫자를 변형해서 출력하라는 것으로, 숫자를 16진수 형태로 바꾸어 출력합니다.
    컴파일러에 따라서는 앞에 0x가 붙기도 하는 것 같고, 자릿수는 OS가 32비트일 때 8자리, 64비트일 때 16자리가 되는 것 같습니다(1자리가 4비트이기 때문에).

    비슷한 변환 문자로서 %x와 %X가 있습니다.
    %x는 숫자를 단순히 소문자 형태의 16진수로 변형하고, %X는 숫자를 대문자 형태의 16진수로 변형합니다.
    변수 값을 16진수로 바꾸고 싶을 때에는 %p보다는 %x 또는 %X를 사용해야 겠습니다.

    답변 1. a의 값이 1인데, 그것을 %p로 출력하니 16진수 형태로 변형되어 0x00000001로 출력된 것입니다.

    답변 2. pa에는 a 변수의 주소값이 저장되어 있습니다.
    pa는 a의 주소값이고, *pa는 pa에 저장된 주소로 찾아간 곳, 즉, a를 나타냅니다.
    그래서 pa를 %p로 출력하면 a 변수의 메모리상 주소가 16진수로 출력되고, *pa를 %p로 출력하면 *pa가 a이기 때문에, a의 값인 1이 16진수로 출력되어 0x00000001로 출력됩니다.

    답변 3. 2에서 설명 드렸듯이 *pa와 a는 같습니다. 따라서 %p로 출력할 시 둘다 0x00000001로 출력됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)