2016-09-01 3 views
0

Wie würde ich einen Zeiger deklarieren, der auf 2D-Array von Zeichenzeigern zeigt. WieZeiger auf 2d Array von Zeigern

char *ar[10][10]; 

In meinem Verständnis ist dieses Array als Array von Arrays gespeichert, so ar verweist auf ein Array von Zeigern, von denen jeder auf eine Spalte in diesem Array verweist. Es hat also drei Ebenen von Zeigern. So sollte es

char ***p; 

So sowohl ar und p deklariert werden sind vom gleichen Typ. Aber wenn ich wie ein 2d-Array für z. p[0][0], gibt es einen Segmentierungsfehler. Warum passiert das und was wäre die korrekte Art, zu deklarieren?

+1

bekommen glaube ich Ihnen eine Vorstellung bekommen von hier http://stackoverflow.com/questions/13554244/how-to-use-pointer-expressions-to-access-elements-of-a-two-dimensional-array-in – Janmenjaya

+1

Arrays! = Zeiger, Ein Array ist ein zusammenhängender Speicherblock, so daß "[10] [10]" eine Platte des Speichers ist, die 10 Felder von 10 'char *' enthält. Das heißt, es ist identisch mit einem 'char * [100]', keine Ahnung, woher du die Idee der Dreifach-Indirection herkommst, aber wenn du '*** p' siehst, trete zurück und frage dich, es gibt einen besseren Weg. Es gibt einen Grund, warum der Begriff [Drei-Sterne-Programmierer] (http://c2.com/cgi/wiki?ThreeStarProgrammer) kein Kompliment ist. –

Antwort

1

wird die Erklärung wie

aussehen
char * ar[10][10]; 

char * (*p_ar)[10][10] = &ar; 

den Zeiger zum Beispiel in der sizeof Operator Dereferenzierung Sie die Größe des Arrays erhalten werden, weil der Ausdruck Typ char[10][10]

printf("%zu\n", sizeof(*p_ar)); 

Der Ausgang haben wird gleich 100

Um zum Beispiel die erste Zeichenkette der ersten Zeile auszugeben ursprüngliche Array unter Verwendung des Zeigers kann

printf("%s\n", (*p_ar)[0][0]); 

zur Ausgabe der ersten Zeichen der ersten Zeichenkette der ersten Zeile des ursprünglichen Arrays schreiben unter Verwendung des Zeigers Sie

printf("%c\n", (*p_ar)[0][0][0]); 

oder

printf("%c\n", *(*p_ar)[0][0]); 
schreiben kann,

Sie könnten auch einen Zeiger auf das erste Element des Arrays deklarieren

Die erste Zeichenkette der ersten Zeile des ursprünglichen Arrays 0

In diesem Fall ist die Ausgabe unter Verwendung des Zeigers kann

printf("%s\n", p_ar[0][0]); 

zur Ausgabe der ersten Zeichen der ersten Zeichenkette der ersten Zeile des ursprünglichen Feldschreib mit dem Zeiger Sie

printf("%c\n", p_ar[0][0][0]); 

oder

printf("%c\n", *p_ar[0][0]); 
0

Ihr Missverständnis schreiben können, ist, dass ea ch der Ebenen wäre ein Zeiger. Das ist nicht wahr.

char ***p bedeutet, dass Sie einen Zeiger haben, der auf einen Zeiger zeigt, der auf einen Zeiger zeigt, der auf ein Zeichen zeigt. Aber das hast du nicht.

Ihre char[10][10] wird als 100 Zeichen in einer Contiguous-Weise gespeichert, von denen jede 10 eine char[10] bildet. Entweder verwenden Sie also entweder einen char *ar[10][10] oder Sie wechseln zu einem char *ar und verwenden diesen für die Adressierung des Arrays in 1D-Mode.Dies kann Vorteile haben, wird aber im Allgemeinen nur empfohlen, wenn die Form des Arrays im Begriff ist, variabel zu sein.

0

Arrays sind keine Zeiger und Zeiger sind keine Arrays. In ähnlicher Weise hat ein Array von Arrays absolut nichts mit einem Zeiger auf den Zeiger zu tun. Wenn dir jemand anders sagte, waren sie verwirrt.

char* ar[10][10] ist ein 2D-Array von Zeichenzeigern. Es kann auch als ein Array von Arrays von Char-Zeigern angesehen werden.

Wenn Sie einen Zeiger auf ein solches Array wollen, würden Sie einen Array-Zeiger verwenden:

char* (*ptr)[10][10] 

Dies als

gelesen wird
  • (*ptr) Array Zeiger auf ...
  • [10][10] ... ein 10x10 Array ...
  • char* ... von char* es ems.
0

Die Erklärung richtig ist,
p[0][0] ist nur ein Zeiger * auf char, können Sie es vor alloc Lagerung darauf zugreifen, so dass Sie ein Segment Fehler