inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

수업 예제 중

129

길민성

작성한 질문수 2

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이면 소수점은 아예 생략되나요?

     

c++

답변 3

1

길민성

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

0

durams

안녕하세요, 질문&답변 도우미 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 인턴

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

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

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

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

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

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

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

교재 있나요?

1

131

2

11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)

1

87

3

using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다

1

99

2

cstr직접구현

0

114

3

BubbleSort

1

75

2

숙제 마지막 부분

1

78

2

강의와 똑같이 진행했는데 링킹 에러가 발생합니다.

1

92

2

수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??

1

159

2

공변반환형 관련 문의 드립니다.

1

89

2

170강 유니크 포인터에대해 질문있습니다

1

79

1

섹션 5 퀴즈의 답이 이상합니다

1

83

2

이중포인터와 배열이 이해가 안됩니다.

1

152

2

5분 17~5분 34초 객체 잘림 질문

1

75

1

Resource.h 코드 알려주세요

1

70

1

char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다

1

93

2

화면좌측 숫자 보이기

1

113

1

화면 좌측 숫자 보이기

0

65

1

처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??

1

136

3

46강 string 버퍼 질문입니다

1

80

2

프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.

1

123

2

[] 범위 검사시 assert 사용 관련 질문

1

87

2

Lecture 클래스 멤버변수 명명 관련

0

89

2

프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요

0

72

1

noexcept과 throw()

1

81

2