我已將我的問題簡化為這個小 C 程式。請注意,我正在自學 C。我在指標方面遇到了真正的麻煩!
#include <stdio.h>
#include <stdlib.h>
typedef struct Elmt_ {
int *i;
struct Elmt_ *next;
} E;
void swap_1(E *x, E *y) {
int *temp = NULL;
temp = x->i;
x->i = y->i;
y->i = temp;
}
void swap_2(E *x, E *y) {
int *temp=NULL;
temp = malloc(sizeof(int));
*temp = *(x->i);
*(x->i) = *(y->i);
*(y->i) = *temp;
}
int main() {
E *p, *q, *r, *s;
int a, b;
a = 8;
b = 50;
p = malloc(sizeof(E));
q = malloc(sizeof(E));
p->i = &a;
p->next = NULL;
q->i = &b;
q->next = NULL;
printf("Initially, *(p->i)=%d *(q->i)=%d\n", *(p->i), *(q->i));
swap_1(p,q);
printf("After swap_1, *(p->i)=%d *(q->i)=%d\n", *(p->i), *(q->i));
r = malloc(sizeof(E));
s = malloc(sizeof(E));
r->i = &a;
s->i = &b;
printf("Initially, *(r->i)=%d *(s->i)=%d\n", *(r->i), *(s->i));
swap_2(r,s);
printf("After swap_2, *(r->i)=%d *(s->i)=%d\n", *(r->i), *(s->i));
return 0;
}
**問題:**在上面的程式中,交換所指向的整數值是swap_1還是swap_2正確的方法i?
我看到這兩個函式似乎都正確地交換了作為引數給出的值。
$ ./a.out
Initially, *(p->i)=8 *(q->i)=50
After swap_1, *(p->i)=50 *(q->i)=8
Initially, *(r->i)=8 *(s->i)=50
After swap_2, *(r->i)=50 *(s->i)=8
uj5u.com熱心網友回復:
函式swap_1交換指標值,而不是指標值。
函式swap_2交換指向的值,但會產生記憶體泄漏。
為了干凈地交換指向的值,您可以簡單地執行以下操作:
void swap_3(E *x, E *y) {
int temp;
temp = *(x->i);
*(x->i) = *(y->i);
*(y->i) = temp;
}
uj5u.com熱心網友回復:
讓我們來看看這個swap_1功能:
void swap_1(E *x, E *y) {
int *temp = NULL;
temp = x->i;
x->i = y->i;
y->i = temp;
}
并畫出每一步,看看會發生什么。
讓我們從
int *temp = NULL;并查看您擁有的所有指標以及它們指向的位置,然后它看起來像這樣:
------ | temp | --> NULL ------ --- --- ------------- | x | --> | i | --> | a from main | --- --- ------------- --- --- ------------- | y | --> | i | --> | b from main | --- --- -------------現在讓我們做第一個任務:
temp = x->i;看看它是如何改變事物的:
------ | temp | ----------\ ------ | ------------- >--> | a from main | --- --- | ------------- | x | --> | i | --/ --- --- --- --- ------------- | y | --> | i | --> | b from main | --- --- -------------如您所見,您現在有兩個指標,都指向同一個位置(
a來自main函式的變數)。現在讓我們做第二個作業:
x->i = y->i;這將改變這樣的事情:
------ ------------- | temp | --> | a from main | ------ ------------- --- --- | x | --> | i | --\ --- --- | ------------- >--> | b from main | --- --- | ------------- | y | --> | i | --/ --- ---同樣,你有兩個指向同一個位置兩個指標(包括
x->i和y->i指向的變數b從main功能)。最后是最后一個任務:
y->i = temp;完成此分配后,指標將如下所示:
--- --- ------------- | x | --> | i | --> | b from main | --- --- ------------- ------ | temp | ----------\ ------ | ------------- >--> | a from main | --- --- | ------------- | y | --> | i | --/ --- ---
從這個很明顯,該swap_1功能不會交換價值的a,并b從變數main函式。相反,它交換指標 x->i和y->i. 的值a,并b仍將是相同的。
要交換的實際值a和b您需要取消參考指標和使用普通的非指標型別temp:
void swap_1(E *x, E *y)
{
int temp = *x->i; // Copy the value from where x->i points
*x->i = *y->i; // Copy the value
*y->i = temp; // Copy the value again
}
如果您將來遇到指標問題,使用鉛筆和紙來繪制和重繪變數以及與上述類似的指標通常有助于可視化實際發生的情況。我建議你自己試試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/408994.html
標籤:
上一篇:參考堆中分配的變數
