2012-12-05 4 views
1

포인터 및 구조체에 대해 아직 배우고 있지만 포인터를 사용하여 개별 멤버에 순차적으로 액세스 할 수 있는지 알고 싶어합니다.포인터가 멤버에 순차적으로 액세스하는 배열 구조체

Typedef record_data { 
    float a; 
    float b; 
    float c; 
    }records,*Sptr; 

    records lists[5]; 
    Sptr ptr; 

예 : 아래의 예에서 내 오류를 용서 플로트 1.0

// instead of this  
    (void)testworks(void){  
    int i; 
    float j=1.0; 
    ptr = &lists[i] 
    ptr->lists[0].a = j; 
    ptr->lists[0].b = j; 
    ptr->lists[0].c = j; 
    ptr->lists[1].a = j; 
    // ... and so on 
    ptr->lists[4].c = j; 
    } 


    // want to do this 
    (void)testwannado(void){ 
    int a,i; 
    float j=1.0; 
    ptr = &lists[i] 
    for (a=0;a<5;a++){ // step through typedef structs 
     for (i=0;i<3;i++){ // step through members 
     ???  
     } 
    } 

의 값으로 5 개 목록의 모든 구성원을 할당하지만, 내가 원하는에 대해 생각할 수있는 가장 가까운 대상을 나타냅니다 I 달성하려고합니다.

int *mptr; 
    mptr = &(ptr->lists[0].a) // want to assign a pointer to members so all 3 members can be used... 
    *mptr++ = j; // so I can do something like this. 

이것은 컴파일되지 않았으므로 다른 오류는 의도하지 않았습니다.

+0

올바른 'float * mptr;'은 사용자의 실수입니다. int로 정의했음을 의미합니다. –

+0

예, 원래이 예제를 작성했을 때 단순화를 위해 멤버를 int로 만들었지 만 float의 길이가 sequenctial stepping을 처리 할 때 중요성을 가질 수 있다고 생각하여 마지막 순간에 변경했습니다. – user1879874

+1

유용하거나 효과가 있습니까? 현재 상태는 무엇입니까? –

답변

0

일반적으로 원하지 않습니다. 구조 멤버는 개별적으로 액세스해야합니다. 여러 개의 연속 구조 멤버가 메모리에 배치되는 방식에 대한 메모리 레이아웃을 가정하여 많은 이식성 문제를 해결할 수 있습니다. 그리고 대부분의 (C와 같은) 언어는 구조체의 멤버를 통해 "내성"을 가질 수있는 방법을 제공하지 않습니다.

+0

'struct '멤버가 연속적인 주소가 아니라는 것이 확실합니까? 나는 그가 올바르게하고 있다고 생각한다! 문제는'* mptr'의 타입입니다. –

+0

연속 주소라는 것을 보장하지 않습니다. 일부 플랫폼/컴파일러는 연속적으로 실행될 수도 있고 그렇지 않을 수도 있습니다. 같은 유형의 필드의 경우, 대부분의 플랫폼이 실제로 연속적으로 배치 할 수 있습니다. 그러나 언어의 정의되지 않은 측면에 의존하는 소프트웨어는 작성하지 않아야합니다. 다른 플랫폼에서는 필드를 원하는대로 꾸리거나 정렬 할 수 있습니다. 다시 말하지만, 우리는 C와 비슷한 언어에 대해 이야기하고 있다고 가정하고 있습니다. – Bogatyr

관련 문제