강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

길민성님의 프로필 이미지
길민성

작성한 질문수

홍정모의 따라하며 배우는 C++

6.7 포인터의 기본적인 사용법

수업 예제 중

작성

·

103

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

수업 예제 중에

int x=5;

double d=123.0;

 

int *ptr_x=&x;

double *ptr_d=&d;

 

cout << ptr_x << endl;

cout << *ptr_x << endl;

 

cout << ptr_d << endl;

cout << *ptr_d << endl;

의 결과가

주소

5

주소

123

으로 나왔는데

 

  1. 왜 x와 d의 주소가 같은가요?

int x 의 주소가 004FF7F8이면 그 다음 선언한 변수 double d는 004FF7FC가 되어야하지 않나요??

  1. *ptr_d를 프린트 했을 때 소수점도 나와야하지 않나요? 0이면 소수점은 아예 생략되나요?

     

답변 3

1

길민성님의 프로필 이미지
길민성
질문자

아! 잘못 봤네요.. 둘다 004FF7F8로 봤습니다..

0

안녕하세요, 질문&답변 도우미 durams입니다.

 

  1. 두 주소가 같다는 말씀이 강의 영상에서 보여준 주소인지, 직접 실행했을때 출력된 주소인지 둘 중 어느 것을 말씀하시는지는 확실하지 않으나, 일단 해당 예제에서 두 포인터 변수 ptr_xptr_d는 각각 다른 변수의 주소를 담고 있으므로, 출력 시에도 다른 주소가 나타나야 합니다.
    강의 영상에서는 ptr_x의 출력으로 004FF7F8이, 그리고 ptr_d의 출력으로 004FF7E8이 나오고 있습니다. (혹시 동일한 주소가 나타났다면 코드를 첨부해주세요!)

    int x의 주소가 004FF7F8일 때, 다음 선언한 변수 double d의 주소가 4바이트 뒤인 004FF7FC가 되어야 하지 않느냐는 질문에 대해서 별개로 말씀드리자면, 반드시 그렇게 되지는 않습니다.



    7.10 스택과 힙에서 배울 내용에 대해 약간 미리 언급을 드리자면, 지역 변수는 스택이라는 메모리 공간에 할당이 됩니다. 이때 빈 공간이 아예 없도록 할당되기보다는 여러가지 이유로 인해(정렬, 컴파일러 최적화 등) 변수들 사이에 공간의 여유를 두거나, 메모리 상의 순서가 바뀌는 경우가 생깁니다.

    저도 비주얼 스튜디오에서 테스트를 해봤는데요, 두 주소값 간에 x86 에서는 0x10, x64에서는 0x24만큼의 차이가 일정하게 나타났습니다. 대신 이러한 최적화를 끌 수는 없었습니다.
    https://stackoverflow.com/questions/43926610/how-are-stack-variables-aligned-on-64-32bit-machine#comment74887081_43926610
    위 링크의 답변을 보시면, '컴파일러는 정렬이 미준수되었을 경우의 성능 저하를 우려하여 정렬을 준수할 것을 고수한다'라고 되어있네요.


     

  2. 네, cout은 기본적으로 부동소수점 타입 값 출력 시, 소수점 아래 자리가 없다면 생략하고 정수 부분만 출력합니다. 대신 2.5 부동소수점수에서 보셨던, <iomanip> 헤더의 std::setprecision을 사용하시면 이 경우에도 소수점 아래까지 출력이 가능합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 길민성님!

질문해 주신 두 가지 사항에 대해 설명 드리겠습니다.

  1. x와 d의 주소가 같은가?

    • 일반적으로 변수들은 연속적인 메모리 주소에 할당되지만, 컴파일러가 메모리 정렬 규칙에 따라 다르게 배치할 수 있습니다. int 변수와 double 변수는 컴파일러에 따라 서로 다른 크기의 메모리 공간을 요구할 수 있으며, 이로 인해 예상한 주소와 실제 할당된 주소가 다를 수 있습니다.
    • C++ 컴파일러마다 메모리 정렬에 대한 구현이 조금씩 다르기 때문입니다. 실제로 주소가 같아 보일 수 있지만, 이는 컴파일러의 최적화나 메모리 정렬 규칙에 따라 발생할 수 있는 현상입니다.
  2. 소수점 생략 여부

    • *ptr_d를 출력할 때 C++의 cout은 기본적으로 소수점을 생략하지 않지만, 123.0은 123으로도 표현할 수 있습니다. 소수점 이하의 숫자가 정확히 0일 때 많은 출력 환경에서 소수점을 생략해 보여주는 경우도 있지만 이는 주로 출력 방식의 차이일 수 있습니다.
    • 만약 소수점을 항상 표시하고 싶다면, cout의 출력 설정을 변경하여 소수점을 강제적으로 출력하도록 설정할 수 있습니다.

관련된 보다 상세한 예제를 이곳에서 확인할 수 있습니다: 함수선언 시 foo(ptr)은 되고 foo(*ptr)안되는 이유가 궁금합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

길민성님의 프로필 이미지
길민성

작성한 질문수

질문하기