2017-10-05 66 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 = temp;'.....'swap (pSRecord [0],&pSRecord [1]);' - >'交換(pSRecord [0],pSRecord [1]);'或'交換(&SRecords [0],&SRecords [1]);' – BLUEPIXY

+0

一旁:並不是每個人都厭倦了包含「學生」的C代碼。那麼所有的老師都會在全世界做同樣的任務嗎? –

回答

4

表達*A具有類型struct StudentRecord而名稱temp被聲明爲具有類型struct StudentRecord *。那是temp是一個指針。

因此,在此聲明

struct StudentRecord *temp = *A; 

初始化沒有意義。

相反,你應該寫

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]); 

如果你想交換指針本身則函數看起來像

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

而在此聲明

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

你的確在嘗試交換指針。

2

首先,你沒有在你的片段中的結構,只是指向結構的指針。因此,你在那裏做的每件事都是試圖交換指針,而不是結構值。

結構通常佔用內存中某處的多個字節。指針是一個包含該內存地址的變量。它也佔用一些內存,即一個64位地址的8個字節。

以下是指向結構對象的指針數組。

struct StudentRecord *pSRecord[numrecords]; 

你用結構對象數組中的地址初始化它。

此調用看起來像是試圖將指針交換到數組中的結構。你做得對。

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

然而由於pSRecord [i]是已的指針struct和你把指針&的地址,所得到的物體將是指針的指針到一個結構。因此,您的交換功能需要**,如下所示。而你的代碼的其餘部分是正確的:

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''

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

因此

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

隨着XOR化子性質,我們知道什麼XOR倒是與本身是0,和任何XOR倒是有0本身,這給了我們:

A'' = B 
B' = A 
+1

既然何時對結構有意義? –

+0

@LeeDanielCrocker從那時起,我沒有得到足夠的睡眠。的Bleh。我將編輯它來處理指向結構的指針。 –

+0

無論如何XOR解決方案是可怕的。上個世紀的把戲。 –