2016-09-15 1 views
-3

ich verstehen will, wie dieser Teil des Codes funktioniert Ich weiß, es scheint einfach, aber ich bin der Zeiger Begriff nicht gut, so etwasIch möchte verstehen, wie dieser Teil des Codes funktioniert

#include<stdio.h> 
    int main(){ 
     int a,b; 
     int *ptr1,*ptr2; 
     a=5; 
     b=a; 
     ptr1=&a; 
     ptr2=ptr1; 
     b=(*ptr2)++; 
     printf("a = %d, b=%d,*ptr1=%d,*ptr2=%d\n",a,b,*ptr1,*ptr2); 
    } 

hilfreich sein würde und der Ausgang ist

a = 6 , b = 5 , *ptr1 = 6 , *ptr2 = 6. 

i müssen Sie understund

danken
+2

Der Schlüssel dies zu verstehen, ist 'b = (* ptr2) ++;' Das nimmt, was 'ptr2' zeigt auf und erhöht sie nach * * seinen Wert zugreifen. – dawg

+0

aber der Wert von b war 5 und es änderte sich nicht? Warum ? – blitz

+1

@blitz Lies dir den Unterschied zwischen 'x ++' und '++ x' durch. – Siguza

Antwort

4
#include<stdio.h> 

int main(){ 
    int a,b; 
    int *ptr1,*ptr2; 
    a=5;  // Assigns value 5 to a 
    b=a;  // Assigns value of a (i.e., 5) to b 
    ptr1=&a; // Assigns address of a to prt1 or ptr1 points to variable a 
    ptr2=ptr1; // ptr2 holds same address as ptr1 does (i.e, address of a) 

    b=(*ptr2)++; 
    /* 
     Now this one is tricky. 
     Look at precedence table here 
     http://en.cppreference.com/w/cpp/language/operator_precedence 
     b is assigned value of *ptr2 first and then 
     value at *ptr2 (i.e., 5) is incremented later. 
     Try replacing b = (*ptr2)++ with b = ++(*ptr2). It'll print 6. 
    */ 

    printf("a = %d, b=%d,*ptr1=%d,*ptr2=%d\n",a,b,*ptr1,*ptr2); 
} 

Lassen Sie uns durch Adresse und val visualisieren Ue Tisch. Angenommen int 1-Byte oder 1-Einheit und Adressraum des Programms mit 100.

a = 5 

    a  
+---+---+---+---+---+-- 
| 5| | | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

b = a 

    a b 
+---+---+---+---+---+-- 
| 5| 5| | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

ptr1=&a 

    a b ptr1 
+---+---+----+----+---+-- 
| 5| 5| 100| | | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 

ptr2 holds some random address when you initialize. 

int *ptr2; 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 5| 5| 100| 234| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 


ptr2=ptr1 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 5| 5| 100| 100| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 

b=(*ptr2)++ 

First, dereference *ptr2 and assign that to b. 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 5| 5| 100| 100| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 
^   | 
    |____________| 

Now increment value at address 100 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 6| 5| 100| 100| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 

Hoffnung beginnt, dass vizulization hilft.

über Zeigerzuweisung Lesen Sie hier: C++ pointer assignment

+0

" // ptr2 Punkte zu ptr1 "sollte sein" Zuweisen von ptr1 zu ptr2 ". 'ptr2' zeigt nicht auf' ptr1'. Detail: "first and then" ist wahrscheinlich, aber _order_ ist nicht definiert. Es ist eher so, als würden die 2 Ereignisse in _some_ sequence_ geschehen (oder nicht), aber der _effect_ ist so, wie Sie ihn kommentiert haben. Ordnung macht einen Unterschied, wenn die Variablen Zugriff haben eine Nebenwirkung. – chux

+0

Wie wäre es damit für 'ptr2 = ptr1': ptr2 hat jetzt die gleiche Adresse wie ptr1 tut. –

Verwandte Themen