2014-04-13 3 views
1

복잡한 프로그래밍에 C++을 처음 사용했습니다. 나는 내 부서를 통해 전해지는 남은, 주석이없는, 학문적 인 코드를 샅샅이 뒤졌고, 나는 구글을 어떻게 할 지 전혀 모르는 무언가를 우연히 발견했다. 구조체의 배열을 참조 할 때 구문을 이해할 수 없습니다.구조체 배열을 참조하는 C++

typedef struct 
{ 
    double x0,y0; 
    double r; 
} circle; 

double foo() 
{ 
    int N = 3; 
    double mtt; 
    circle circles[N]; 

    for (int i = 0; i < N; i++) 
    { 
     mtt += mtt_call_func((circles+i), N); 
    } 

    return mtt; 
} 

(circles+i)이 경우에는 무엇을 의미 하는가 :

여기

내가 고민하고있는 무슨의 손질 버전?

편집 : 함수는 (circle + i)이 아닌 (circles + i)이어야합니다.

+1

컴파일됩니까? 'circle + i '이어야합니다. –

+0

구조체의 크기에 따라 다릅니다. 구조체의 배열을 선언 할 때 인접한 메모리가 구조체의 멤버가되는 순서대로 정확하게 정렬되기 때문에'sizeof (circle) '를 호출하여 구조체가 패딩과 얼마나 큰지 알 수 있습니다. 선언했다. – noobProgrammer

+1

'circle'은 유형입니다.아마 당신의 코드는'(circle + i)'라고 말해야합니다. – ooga

답변

3

circles+i&circles[i]과 같습니다. 포인터 계산이 C++에서 작동하는 방식입니다.

왜 포인터가 있습니까? 글쎄, &circles 또는 sizeof circles 이외의 컨텍스트에서 배열 이름을 지정하면 배열의 첫 번째 멤버를 가리키는 임시 포인터가 만들어집니다. 이것이 바로 여러분의 코드가 작동하는 것입니다. 배열은 C++의 2 등 시민입니다. 그들은 물건처럼 행동하지 않습니다.

+0

감사합니다. 네, 맞습니다 (원래 질문에 대한 편집을했습니다). 당신은 이것을 매우 간결하게 설명했고, 저는 이것을 추가 배경 정보에 대한 답으로 표시 할 것입니다. – ionick

1

C에서는 C++에서와 같이 배열을 포인터로 처리하는 것이 적합합니다. 따라서 circles+icircle 크기의 icircles의 주소에 추가합니다.

&circles[i]을 쓰는 것이 더 명확 할 수도 있습니다. 이 형식에서는 표현식이 배열의 i 번째 구조체에 대한 포인터를 생성한다는 것이 더욱 분명합니다.

2

circle+i는 "포인터 원을 가지고 그것을 가리키는 개체의 크기에 의해 번이나 이동"을 의미한다 (나는 다른 사람들이 제안대로 circle+icircles+i에 대한 오타했다 있으리라 믿고있어). 배열의 이름이 첫 번째 요소에 대한 포인터이기 때문에 포인터가 관련되어 있습니다.

는이 외에도에서 당신은 루프에서 사용되는 정수 카운터 변수를 초기화해야합니다

for (int i = 0; i < N; i++) 
      ^^^^ 
{ 
    mtt += mtt_call_func((circles + i), N); 
           ^// typo 
} 
+0

은 ~을 말하지 않아야합니다. –

+0

@DragosRizescu 이유가 무엇입니까? –

+0

Misread, 나는 그 안에 변수를 선언하지 말라고했다. –

0

실제로 벡터의 첫 번째 인덱스 0에 대한 포인터입니다 당신이 스택에 선언 각 벡터. i를 사용하면 색인에서 색인으로 이동합니다. 결과적으로 (circles+i)&circles[i]과 같습니다.

&은 변수의 주소를 의미합니다. 함수 호출에서와 마찬가지로 변수의 주소를 저장하는 포인터를 보내므로 circles[i] 앞에는 &이 필요합니다. 변경하려면 벡터 서클의 i 인덱스 주소가 필요하므로 기능. 포인터에 대한 자세한 내용은

, 벡터 및 구조물이 체크 아웃 : http://pw1.netcom.com/~tjensen/ptr/pointers.htm

그것은 지상의 기초 과정을 포함해야한다.

+1

리소스를 제공해 주셔서 감사합니다. 당신의 설명도 훌륭합니다. – ionick

관련 문제