Ich habe gerade angefangen, C zu lernen, und um das Verständnis von Zeigern und Arrays zu verbessern, habe ich versucht, auf die Elemente eines Arrays zu verweisen, ohne überhaupt einen Zeiger zu erstellen:
for(k1 = 0; k1 < ROW; k1++){
for(k2 = 0; k2 < COLUMN; k2++){
array[k1][k2] = k1*COLUMN + k2 + 1;
printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));
}
}
Der gesamte Code wird kompiliert und funktioniert einwandfrei.
Ich stelle mir vor, für jedes einzelne Array in einem großen Quellcode einen Zeiger erstellen zu müssen, ist höchst ineffizient.
Ist es also eine schlechte Programmierpraxis, die Adresse des Arrays direkt zu verwenden, anstatt die Adresse eines Arrays mit einem Zeiger speichern und abrufen zu lassen, wie oben gezeigt?
programming-practices
c
Niko Gambt
quelle
quelle
printf "[%d][%d] = %d\n", k1, k2, array[k1] [k2]));
würde die Zeigerarithmik umgehen und ist einfacher zu verstehen.Antworten:
Es ist nur insoweit "schlecht", als es weniger lesbar ist.
a[x]
ist das Gleiche wie*(a+x)
, so gibt es keinen Unterschied in Effizienz oder Verhalten (in der Tatx[a]
wird auch funktionieren). Es ist nur so, dassa[x]
es für uns Menschen normalerweise viel intuitiver ist.Das heißt aber nicht, dass Lesbarkeit keine große Sache ist. Überlegen Sie, wie Sie diese beiden Ausdrücke "lesen" würden, wenn Sie sie im Code sehen würden, um zu sehen, wie groß sie sind:
*(a+x)
= "Das Ding, auf das durch die Summe von Zeigera
und Ganzzahl gezeigt wirdx
"a[x]
= "Dasx
dritte Mitglied des Arraysa
"Ebenso, wenn Sie auf die Adresse eines Array-Elements verweisen müssen:
(a+x)
= "Die Summe von Zeigera
und Ganzzahlx
"&a[x]
= "Die Adresse desx
dritten Mitglieds des Arraysa
"Meistens sind die
[]
Versionen einfacher zu verstehen, wenn Sie nicht-trivialen Code betrachten, der auf mehreren verschiedenen Arrays (insbesondere Arrays von Arrays) ausgeführt wird. Deshalb gibt es den[]
Operator überhaupt.PS Es ist eine sehr gute Idee, so etwas nur als Lernübung zu machen. Es ist wichtig zu verstehen, dass Arrays wirklich nur Zeiger und Offsets sind.
quelle
Ja, es ist eine schlechte Praxis, aber nicht aus Gründen der Ineffizienz.
Der Array-Operator verwendet Zeiger-Arithmetik unter der Haube, sodass sie gleichermaßen effizient sind.
Das Problem mit der Zeigerarithmetik ist, dass sie sehr fehleranfällig und schwerer zu lesen ist.
Faustregel: Verwenden Sie keine Zeigerarithmetik, es sei denn, Sie müssen.
quelle
Cool your learning c, du hast gerade einen kleinen Zungenbrecher entdeckt. Sie führen keine Zeigerarithmetik für ein Array aus, sondern für ein Array von Zeigern. Das Ausführen von Zeigerarithmetik für Arrays ist nicht möglich. Ein Array verwandelt sich in einen Zeiger, ist jedoch kein Zeigertyp. Was du mein hast (siehe Kommentar von cmaster) ist
Die Referenzierung dieses Zeigers gibt den Wert an, auf den Ihr gerade berechneter Zeiger zeigt. Im Allgemeinen macht es keinen Sinn, das zu tun, was Sie tun. Aber Sie können das Array linearisieren und dann einen Schritt darin machen.
Schritt sie ist x_dim. Hoffe meine Antwort klärt sich!
quelle
int* array[ROW];
einint array[ROW][COLUMN];
oder ein verwendet wirdint (*array)[COLUMN];
. Jede dieser drei Definitionen kann mit dem Code im OP verwendet werden.