2017-11-13 9 views
1

여기에 무슨 일이 일어나고 있는지 확실하지 않지만 Clion을 내 IDE로 사용하고 있는데이 IDE와는 아무 관계가 없다고 생각하지만 그 정보를 추가한다고 생각했습니다. 내 혼란은 내가 쓴 기능에서 온다.메모리 주소가 표시됩니까? C++

int Arry() 
{ 

int Mynumbers [5] = {10}; 

    std::cout << Mynumbers; 
} 

무언가 간단하다. 5 개의 정수에 10의 값을 할당해야합니다. 그러나 Mynumbers를 인쇄 할 때 메모리 주소가 표시됩니다. 이런 일이 일어나는 이유는 포인터를 호출하는 것이라고 생각했습니다. 시간 내 주셔서 감사합니다.

감사

, 니콜라스

+3

<<<는 연산자 함수이고, Mynumbers는 전달 될 때 포인터로 감쇠합니다. – George

+3

'5 개의 정수에 10의 값을 할당해야합니다. '아니요, 안됩니다. 첫 번째 것, 나머지는 0입니다.'하지만 Mynumbers를 인쇄 할 때 메모리 주소가 표시됩니다. '포인터를 인쇄하고 있습니다. – DimChtz

+0

모든 배열 함수는 포함하고있는 첫 번째 요소의 메모리 주소를 가리키는 포인터입니다. –

답변

0

사용해, myNumbers의 값은, 실제로 어레이의 첫 번째 요소의 ADRESS이다.

는 다음과 같은 시도 : C++에서

for(int i=0; i<5;i++) { 
    cout << Mynumbers[i]; 
} 
+4

배열은 주소가 아닙니다. 배열은 * 포인터로 붕괴하지만 같은 것은 아닙니다. –

+0

"Mynumbers의 값은 실제로 배열의 첫 번째 요소의 주소입니다."그래서 ... sizeof (Mynumbers)의 값이 sizeof (Mynumbers [0]) * 5로 계산되는 이유는 무엇입니까? 'Mynumbers '는 주소인가? – Geoff

+1

@Geoff'sizeof'는 컴파일 타임 작업을 수행합니다. – George

1

, 당신은 (이것은 엄격하게 사실이 아니다, 그리고 다른 사람들이 미묘한 차이를 설명 할 수있는) 메모리 주소에 대한 포인터로 배열 생각할 수 있습니다. 배열 이름에 cout을 호출하면 그 내용을 요구합니다 : 메모리 주소.

어레이에서 무엇을보고 싶은 경우, 간단한 for 루프를 사용할 수 있습니다

for (int i = 0; i < 5; i++) 
    std::cout << Mynumbers[i] << " "; 
+0

이것은 내가 처음에 찾고 있던 정보를 보여주었습니다. 설명해 주셔서 감사합니다. – Learning

+0

포인터가되는 배열 뒤에있는 생각은 혼란 스럽습니다. 그러나 나는 그것을 더 깊이 이해하려고 잠수하려고 노력할 것이다. – Learning

+0

여러분을 환영합니다! (: – ajrind

2

일부 노트 :

void Arry()      // use void if nothing is being returned 
{ 
    int Mynumbers[5] = {10}; // first element is 10, the rest are 0 
    //std::cout << Mynumbers; // will print the first address because the array decays to a pointer which is then printed 
    for (auto i : Mynumbers) // range-for takes note of the size of the array (no decay) 
     std::cout << i << '\t'; 
} 
+0

Auto의 사용법에 대해 조사한 결과, 여기에 사용 된 것을 볼 수 있습니다. 왜 그것을 사용했는데 C에서 사용 된 것처럼 보이지만 많은 사람들이 C++에서 사용하지 않는 것 같습니다. – Learning

+0

@Learning ['auto'] (http://en.cppreference.com/w/cpp/keyword/auto) 키워드가 다시 목적으로 사용되었습니다. 이제는 다른 기능을 수행합니다. [범위 기반 for 루프] (http://en.cppreference.com/w/cpp/language/range-for)도 새로운 구조입니다. – wally

+0

오 대단합니다. 렉스 제게 알려 줘서 고마워요. 왜냐하면 제가 XD를 사용하는 방법을 모르겠다는 것이 정말 대단한 것 같아요. – Learning

3

그것은 조금 복잡하고 몇 가지가있다 std::cout는 채소 인의

  1. std::cout (실제로, std::ostream을 : 놀이에 문제 nce에는 일반 배열을 이해하는 operator<<의 오버로드가 없습니다. 포인터를 이해하는 오버로드가 있습니다.
  2. C++ (및 C)에서 배열 이름은 포인터가 필요한 곳에 표현식으로 사용할 수 있습니다. 더 좋은 옵션이 없을 때, 배열 이름은 의 포인터에 대한 붕괴입니다. 이것이 다음과 같이 합법적 인 것입니다. int a[10] = {}; int* p = a;.
  3. 포인터가있는 오버로드는 포인터가 char* 또는 const char* (또는 wchar 버전)이 아닌 한 16 진수 주소로 인쇄합니다.이 경우 포인터는 null로 끝나는 문자열로 처리됩니다.

여기에있는 일은 다음과 같습니다. 배열과 일치하는 오버로드가 없기 때문에 포인터를 가져 오는 오버로드가 줄어 듭니다. 문자 유형 포인터가 아니기 때문에 16 진수 주소를 볼 수 있습니다. cout << &MyNumbers[0];에 상응하는 금액이 표시됩니다.

+0

WOw. 내가 여기 왔을 때의 반응이 굉장히 좋아요. 모두들 정말로 원합니다. 이 질문들을 자신의 능력을 최대한 발휘하여 설명해 주었고 정말 놀라웠습니다. 이것이 제가 게시 한 첫 번째 질문입니다. 지금 당장은 압도적인데, 많은 정보가 나와 아무 것도없는 사람과 함께 자신을 배우려고 노력해 왔기 때문에 아무도 감히 내 주위에 산다. 그래서 나는 더 자주 이곳에있을 것이라고 생각합니다. 나는 수 시간의 검색으로 얻은 것보다 더 많은 것을 배웠다. 다들 감사 해요. – Learning