2017-05-04 222 views
1
void main(){ 
int a = 100; 
int* pa = &a; 
*pa = 999; 
} 

上面的代碼會使a的值爲999.但是爲什麼不用相同的方式處理結構的指針呢?C - 傳遞結構指針VS函數的整數指針

struct node* head = (struct node*) malloc(sizeof(struct node)); 
head -> data = 6; 
head -> next = NULL; 

爲什麼我們不能使用*head -> data = 6?爲什麼通過someMethod(pa)是通過引用和someMethod(head)是傳遞值? reference

+2

嗯......兩者都在這裏傳遞指針(「引用」)。你可以改變它們指向的東西('int'或'struct'),但是用雙指針,你不能改變它們指向的地方。所以你的第二個問題是無意義的。你的第一個問題基本上誤解了' - >'的用途,即在一個運算符中取消引用和查找屬性。你總是可以做'(* head).data = 6;'如果你想看到'*'進行解引用。 – ShadowRanger

+0

@ShadowRanger你的意思是 - *但是用雙指針,你可以**改變他們指向的位置*? –

+0

@AjayBrahmakshatriya:哎呀。很確定我的意思是鍵入*,但**沒有**雙指針... *。同樣的想法。 – ShadowRanger

回答

6

爲什麼我們不能使用*head -> data = 6

因爲->是引用操作是取代星號*。您可以用星號改寫,也

(*head).data = 6 

你需要括號,因爲dot has higher precedence than indirection。運營商->已被引入,以便在指向struct的指針的情況下使間接更易讀。

爲什麼通過someMethod(pa)通過引用傳遞和someMethod(head)是傳值?

它都是按值傳遞的,因爲指針也是按值傳遞的。傳遞指針可以引用原始變量並對其進行修改,但指針本身已被複制。

1

第一個問題的答案,你已經得到了。
對於第二個問題,考慮三個變量,A,B,C,其中A & C是整數變量,B是整數指針。圖片中顯示了變量名稱,它們的值和地址(假設看到一個內存映射) 。 See variables, their names, values and address

看到這個代碼

void fun(int *b,int *c) 
{ 
    printf("\nfun %d",*b); 
    b=c; 
} 
void fun1(int **b, int *c) 
{ 
     printf("\nfun1 %d",**b); 
    *b=c; 
} 
int main() 
{ 
    int a=10; 
    int c=200; 
    int *b=&a; 
    printf("\n %d %d %d",a,*b,c); 
    fun(b,&c); 
    printf("\n %d %d %d",a,*b,c); 
    fun1(&b,&c); 
    printf("\n %d %d %d",a,*b,c); 

    return 0; 
} 

main(),一個& c是本地整數變量,具有不同數據和b是整數指針。我們調用函數fun()這樣,

fun(b,&c); 

因爲,B是一個指針的話,我們是傳遞的(1000)b即地址的值。 因此,如果我們修改函數fun()中的b,則該更改將僅反映在fun()的內部。
現在我們調用函數fun1()

fun1(&b,&c) 

在這裏,我們傳遞b即(3000)的地址。所以,當我們修改fun1()中的b時,我們也會在main()中看到反射。

所以,按值傳遞意味着,我們希望使用值而不修改存在於調用函數(main())中的原始指針。但我們通過參考,當我們需要任何重大變化,應該反映在我們的調用函數(main())本身。
我希望,這清除了懷疑。

+0

我非常感謝你的努力! –