2016-08-03 18 views
-1

Betrachten der Code unter:Wird der Zeiger nicht gleich dem der Ganzzahl erhöht?

void increment(int* a) 
{ 
    printf("%d\n",a); 
    *a=*a+1; 
} 
int main() 
{ 
    int a=10; 
    int* p=&a; 
    increment(&a); 
    printf("%d",a); 
    return 0; 
} 

Dies ist ein 11 um erhöht, aber diese:

void increment(int* a) 
{ 
    printf("%d\n",a); 
    *a++; 
} 
int main() 
{ 
    int a=10; 
    int* p=&a; 
    increment(&a); 
    printf("%d",a); 
    return 0; 
} 

Der obige Code erzeugt Wert als 10.

der arithmetische Zeiger ist nicht wie Ganzzahlarithmetik oder fehle ich hier etwas ??

+0

@Bathsheba yeah ... '*** a = * a + 1 ; **
'WT *? –

Antwort

0

Die Anweisung printf("%d\n",a); druckt nicht den Wert der Ganzzahl, auf die a zeigt. Wie geschrieben, ruft es undefiniertes Verhalten auf.

printf("%p\n", (void*)a); 

würde den Wert des Zeigers, dh die Adresse der Integer-Variablen, ausgeben.

printf("%d\n", *a); 

würde den Wert der Ganzzahl ausgeben.

Außerdem ist *a=*a+1; nicht dasselbe wie *a++;. Aufgrund der Vorrangregeln für Operatoren wird *a++ als *(a++) analysiert, der Zeiger wird inkrementiert, nicht der Wert, auf den verwiesen wird. Sie könnten ++*a; als Abkürzung für *a = *a + 1; verwenden, und andere Varianten sind möglich: ++a[0], a[0]++, (*a)++, aber die bevorzugte Lösung ist:

*a += 1; 
+0

'(* a) ++' funktionieren würde; so würde 'a [0] ++'. –

3

Ihnen fehlen Operatorprioritäten. Die (*a)++; ist etwas ganz anderes als *a++. Der erste Wert wird bei der Adresse a inkrementiert, der zweite nach dem Inkrement a und erhält den Wert an der ursprünglichen Adresse.

+0

was macht * a ++ tatsächlich erhöht es die Adresse? Wenn das so ist, wie ?? Ich bin nicht in der Lage, es zu betrachten –

+0

'a' ist nur lokale Variable. Es wird erhöht, aber es wird nicht mehr verwendet, also kein Schaden. Wenn Sie darauf schreiben, ändert sich der Speicher, nachdem die ursprüngliche Variable – KIIV