2016-03-21 6 views
-5

Beim Drucken eines Arrays funktioniert die Initialisierung einer ganzen Zahl.C/C++: Warum ist es unmöglich, einen Zeiger in der Schleifeninitialisierung zu deklarieren?

int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10}; 

for (int i = 0; i <= (MAX_SIZE - 1); i++) 
{ 
    printf("%3d",a[i]); 
} 

Allerdings frage ich mich, warum einen Zeiger auf eine ganze Zahl ("Walker") initialisiert wird nicht funktionieren:

int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10}; 

for (int *aWalk = a, int *aEnd = a + MAX_SIZE - 1; aWalk <= aEnd; aWalk++) 
{ 
    printf("%3d", *aWalk); 
} 
+7

Bitte wählen Sie eine Sprache. Das heißt, die Anweisung "int * aWalk = a, int * aEnd = a + MAX_SIZE - 1" würde nicht einmal für sich arbeiten, so dass sie auch nicht in einem Loop-Header funktionieren kann. –

+9

'wird nicht funktionieren' ist eine sehr schlechte Problembeschreibung, FWIW. –

+0

Was ist der Wert von 'MAX_SIZE'? –

Antwort

7

Die Aussage int *aWalk = a, int *aEnd = a + MAX_SIZE - 1; würde auf seinem eigenen nicht einmal arbeiten, so kann es in einem Schleifenkopf entweder nicht funktionieren. Die Syntax Sie suchen, ist dies:

int *ptr1 = some_address, *ptr2 = some_other_address; 

Dieses innerhalb und außerhalb einer Schleife funktioniert. Beachten Sie außerdem, dass Ihr Problem nicht einen sondern zwei Zeiger deklariert. Deshalb sollten Sie zuerst ein minimales Beispiel extrahieren.

-1

Sie haben einen zusätzlichen int im zweiten Code. Auch die Platzierung von Komma ist falsch. Auch entfernt unnötige aEnd Variable.

int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10}; 

for (int *aWalk = a; *aWalk < (a + MAX_SIZE - 1); aWalk++) 
{ 
    printf("%3d", *aWalk); 
} 
+3

Ich bin mir ziemlich sicher, dass es da sein sollte. Jetzt ist "aEnd" undefiniert. – Biffen

+0

IMHO 1. ';' ist ',' und das letzte ',' ist ein ';' in der 'for' Zeile ... – TrueY

+2

Die Platzierung von Komma ist in der Frage korrekt. Nur das extra 'int' ist falsch. – user2079303

0

Sie können dies nur mit Zeigerarithmetik tun. Dies funktioniert, weil Sie ein Array von Daten deklarieren und diese Daten kontinuierlich im Speicher gespeichert werden.

int a[] = {1,2,3,4,5,6,7,8,9,10}; 

for (int *aWalk = a; aWalk < (a + sizeof(a)/sizeof(int)); aWalk++) 
{ 
    printf("%3d", *aWalk); 
} 

Versuchen Sie es auch hier IDE One[^].

edit:

aufgrund der Kommentare, die ich den Code mit einem Endzeiger geändert. code[^].

for (int *aWalk = a, *aEnd = (a + sizeof(a)/sizeof(int)); aWalk < aEnd; aWalk++) 
{/*...*/} 
+0

Ich denke, die Idee hinter 'aEnd' ist, die Array-Größe nicht in jeder Schleifeniteration auszuwerten (natürlich besteht in diesem Fall eine gute Chance, dass der Compiler die Berechnung optimiert. – juanchopanza

+1

@juanchopanza - Potenziell falsch. Das muss nicht unbedingt sein werte die Array-Größe in jeder Schleifeniteration aus. 'sizeof' ist ein Kompilierzeit-Operator, also 'sizeof (a)/sizeof (int)' ist eine Kompilierzeitkonstante. Da 'a' sich in der Schleife nicht ändert, ein Compiler könnte die Auswertung von "(a + sizeof (a)/sizeof (int))" aus der Schleife hissen. Ob dies der Fall ist oder nicht, ist eine Frage, wie gut der Compiler optimiert. Beachten Sie jedoch, dass diese Technik funktioniert funktioniert nicht, wenn 'a' ein Zeiger ist (was passiert, wenn das Array als Argument an eine Funktion übergeben wird). – Peter

+0

@Peter Welcher Teil ist "potentiell falsch"? Ich sagte, es gibt eine gute Änderung, der Compiler wird die Berechnung optimieren. Es muss nicht, aber es kann und wird es wahrscheinlich. – juanchopanza

1

Der for anfängliche Ausdruck kann so lange eine Definition für mehrere Variablen sein, wie es als eine einzige Definition kombiniert wird:

int a[MAX_SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

for (int *aWalk = a, *aEnd = a + MAX_SIZE; aWalk < aEnd; aWalk++) { 
    printf("%3d ", *aWalk); 
} 

beachten, dass es mehr generisch ist, den Endzeiger zu definieren Vergangenheit Punkt Das Ende des Arrays, da dieses Formular Segmente der Breite 0 verarbeiten kann.