2017-10-05 1 views
0

안녕하세요, 저는 구조의 처음 두 요소를 바꿔주는 스왑 함수를 만들려고합니다. 누군가이 작품을 만드는 방법을 보여 주실 수 있습니까?두 구조를 C로 바꿔서

void swap(struct StudentRecord *A, struct StudentRecord *B){ 
    struct StudentRecord *temp = *A; 
    *A = *B; 
    *B = *temp; 
} 


struct StudentRecord *pSRecord[numrecords]; 

for(int i = 0; i < numrecords; i++) { 

pSRecord[i] = &SRecords[i]; 

} 

printf("%p \n", pSRecord[0]); 
printf("%p \n", pSRecord[1]); 

swap(&pSRecord[0], &pSRecord[1]); 

printf("%p \n", pSRecord[0]); 
printf("%p \n", pSRecord[1]); 
+2

'temp'를 포인터가 아닌 값으로 만드는 것이 더 좋습니다. –

+1

'struct StudentRecord * temp = * A;'->'struct StudentRecord temp = * A;'..'* B = * temp;'->'* B = 임시;'.....'스왑 (& SRecords [0], & SRecords [1]); – BLUEPIXY

+0

옆에 : (& pSRecord [0], & pSRecord [1]); 모두가 "학생"을 포함하는 C 코드에 실망하지는 않습니다. 그래서 모든 선생님들은 전 세계에 똑같은 과제를줍니다. –

답변

4

*A 이름이 입력 tempstruct StudentRecord *을 갖는 것으로 선언하면서 struct StudentRecord 입력 갖는다. 즉, temp은 포인터입니다.

따라서이 선언

struct StudentRecord *temp = *A; 

의 초기화는 이해가되지 않습니다.

void swap(struct StudentRecord *A, struct StudentRecord *B){ 
    struct StudentRecord temp = *A; 
    *A = *B; 
    *B = temp; 
} 

원래 포인터 자체는 변경되지 않았 음을 고려 같은 기능의 모양을 결과로

대신 당신은

struct StudentRecord temp = *A; 

를 작성해야합니다. 변경 될 포인터가 가리키는 객체입니다. 당신이 포인터를 교체하려면

는 따라서 기능 자체가 그 기능을

void swap(struct StudentRecord **A, struct StudentRecord **B){ 
    struct StudentRecord *temp = *A; 
    *A = *B; 
    *B = temp; 
} 

처럼 그리고이 문장

swap(&pSRecord[0], &pSRecord[1]); 

에서 찾게됩니다

swap(pSRecord[0], pSRecord[1]); 

처럼 호출 할 필요가 당신은 실제로 포인터를 교환하려고합니다.

2

먼저 구조체에 대한 포인터 만, 구조체에 대한 포인터가 없습니다. 따라서 거기에있는 모든 작업은 포인터를 교환하는 것이지 구조체 값을 바꾸려는 시도는 아닙니다.

구조체는 일반적으로 메모리 어딘가에 여러 바이트를 차지합니다. 포인터는이 메모리의 주소를 포함하는 변수입니다. 이는 또한 일부 메모리, 즉 64 비트 어드레스에 대해 8 바이트를 차지한다.

다음은 struct 개체에 대한 포인터 배열입니다.

struct StudentRecord *pSRecord[numrecords]; 

구조체 개체의 배열에서 주소로 초기화했습니다.

이 호출은 배열의 구조체에 대한 포인터를 바꾸는 시도처럼 보입니다. 너는 그것을 올바르게했다. pSRecord [내가] 구조체에 대한 포인터가 이미 당신은 포인터 &의 주소를 가지고 있기 때문에

swap(&pSRecord[0], &pSRecord[1]); 

그러나, 결과 객체는 구조체에 대한 포인터 포인터 될 것입니다. 따라서 스왑 함수는 다음과 같이 **이 필요합니다. 그리고 코드의 나머지 부분은 올바른 :

void swap(struct StudentRecord **A, struct StudentRecord **B) { 
    struct StudentRecord *temp = *A; 
    *A = *B; 
    *B = *temp; 
} 
0

@Serge는 그의 대답에, 그것은 당신이 일을하려고하는 것은 스왑 포인터처럼 보이는 말했듯이.포인터를 바꿀 수 있으려면 포인터에 포인터를 전달해야합니다. 거기에서 여분의 공간을 사용하지 않고 두 조각의 데이터를 교환 할 수있는 논리 연산자를 사용하여 멋진 조그만 기법도 있습니다. 그것이 작동하는 이유

void swap(struct StudentRecord **A, struct StudentRecord **B){ 
    *A ^= *B; 
    *B ^= *A; 
    *A ^= *B; 
} 

은 : 초기 값 AB 시작합니다. 우리는 그것들을 함께 모아서 A에 저장합니다. 우리는 이것을 A'이라고 부를 것입니다. XORA'B으로 변경하고 B에 저장하십시오. B'이라고합니다. 마지막으로 XORA'B'으로 설정하고 A에 저장합니다.이 값을 A''이라고합니다. XOR의 propeties와 그러므로

A'' = A' XOR A' XOR B 
B' = A XOR B XOR B 

A'' = A' XOR B' 
B' = A' XOR B 
A' = A XOR B 

, 우리는 XOR 아무것도 '자체가 0으로 D 및 XOR 아무것도'는 것을 알 수 0 우리주는 그 자체이다와 D :

A'' = B 
B' = A 
+1

'^'는 구조체에서 의미가있는 때부터? –

+0

@LeeDanielCrocker 그 시간 이후로 나는 충분한 잠을 갖지 못했습니다. bleh. 구조체에 대한 포인터를 다루기 위해 그것을 편집 할 것이다. –

+0

어쨌든 XOR 솔루션은 끔찍합니다. 지난 세기 트릭. –

관련 문제