Warum kann ich im Fall des zweidimensionalen Arrays von int ** in int * konvertieren, aber nicht im Fall des Arrays von Zeigern?

Yam Bisker
#include <stdio.h>
#include <string.h>
int main(void)
{
    int arr2d[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    int* arr = (int*)arr2d;
    int i = 0;
    for (i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }

    printf("\n\n");
    int arr1[] = { 11,12 };
    int arr2[] = {13, 14, 15, 16};
    int arr3[] = { 17, 18, 19 };
    int * parr[3] = { arr1,arr2,arr3 };
    int *parr1 = (int*)parr;
    for (i = 0; i < 9; i++)
    {
        printf("%d ", parr1[i]);
    }
    return 0;

Hier am Anfang habe ich von einem zweidimensionalen Array konvertiert und es gedruckt, aber danach habe ich es mit einem Array von Zeigern gemacht und es hat nicht funktioniert. Kann jemand es bitte erklären?

neuro_sys

Vielleicht möchten Sie lernen, wie diese Objekte im Speicher angeordnet sind:

int array[][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
int *p_array = (int *) array;

Dadurch wird ein Objekt arrayvom Typ int[][3]im Speicher (in diesem Fall Stack) erstellt, das physikalisch in einer hypothetischen (16-Bit-Wortgröße) Architektur angeordnet ist als:

  array 0x8000: 0x0001
        0x8002: 0x0002
        0x8004: 0x0003
        0x8006: 0x0004
        0x8008: 0x0005
        0x800A: 0x0006
        0x800C: 0x0007
        0x800E: 0x0008
        0x8010: 0x0009
p_array 0x8012: 0x8000

Wo 0x8000bezeichnet die imaginäre Stapeladresse von array.

Aber in deinem zweiten Beispiel:

int array1[] = { 11, 12 };
int array2[] = { 13, 14, 15, 16 };
int array3[] = { 17, 18, 19 };
int *array_pointers[] = { array1, array2, array3 };

int *array_pointers2 = (int*) array_pointers;

Hier array_pointersist vom Typ, int *[]was bedeutet, dass es ein Zeiger auf ein Array von ints ist. Und das Speicherlayout wäre wie folgt:

array1 0x8000: 0x000B
       0x8002: 0x000C
array2 0x8004: 0x000D
       0x8006: 0x000E
       0x8008: 0x000F
       0x800A: 0x0010
array3 0x800C: 0x0011
       0x800E: 0x0012
       0x8010: 0x0013

und

array_pointers:  0x8012: 0x8000 address of array1
                 0x8014: 0x8004 address of array2
                 0x8016: 0x800C address of array3
array_pointers2: 0x8018: 0x8012 address of array_pointers

Wenn Sie also versuchen, den Inhalt von zu drucken array_pointers2, der jetzt Zeiger auf das Array von ints enthält, werden die Adresswerte und nicht die Zahlen ausgegeben, auf die sie zeigen.

Hier ist ein Beispiel, das die Speicheradresse dieser Objekte ausgibt:

https://ideone.com/T52Ow0

Welche Drucke:

array      0x7ffeda682090: 0x00000000000001
           0x7ffeda682094: 0x00000000000002
           0x7ffeda682098: 0x00000000000003
           0x7ffeda68209c: 0x00000000000004
           0x7ffeda6820a0: 0x00000000000005
           0x7ffeda6820a4: 0x00000000000006
           0x7ffeda6820a8: 0x00000000000007
           0x7ffeda6820ac: 0x00000000000008
           0x7ffeda6820b0: 0x00000000000009
p_array    0x7ffeda682038: 0x007ffeda682090

array1     0x7ffeda68204c: 0x0000000000000b
           0x7ffeda682050: 0x0000000000000c
array2     0x7ffeda682060: 0x0000000000000d
           0x7ffeda682064: 0x0000000000000e
           0x7ffeda682068: 0x0000000000000f
           0x7ffeda68206c: 0x00000000000010
array3     0x7ffeda682054: 0x00000000000011
           0x7ffeda682058: 0x00000000000012
           0x7ffeda68205c: 0x00000000000013
array_poin 0x7ffeda682070: 0x007ffeda68204c
           0x7ffeda682078: 0x007ffeda682060
           0x7ffeda682080: 0x007ffeda682054
array_poi2 0x7ffeda682040: 0x007ffeda682070

auf meinem Computer.

Quellcode dafür, falls externer Link abläuft:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int array[][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
    int *p_array = (int*) array;

    for (int i = 0; i < 9; i++) {
        printf("%-10s %08p: %016p\n", i == 0 ? "array" : "", &p_array[i], p_array[i]);
    }

    printf("%-10s %08p: %016p\n", "p_array", &p_array, p_array);

    int array1[] = { 11, 12 };
    int array2[] = { 13, 14, 15, 16 };
    int array3[] = { 17, 18, 19 };

    int *array_pointers[] = { array1, array2, array3 };
    int *array_pointers2 = (int*) array_pointers;

    putchar('\n');

    for (int i = 0; i < sizeof(array1) / sizeof(array1[0]); i++) {
        printf("%-10s %08p: %016p\n", i == 0 ? "array1" : "", &array1[i], array1[i]);
    }

    for (int i = 0; i < sizeof(array2) / sizeof(array2[0]); i++) {
        printf("%-10s %08p: %016p\n", i == 0 ? "array2" : "", &array2[i], array2[i]);
    }

    for (int i = 0; i < sizeof(array3) / sizeof(array3[0]); i++) {
        printf("%-10s %08p: %016p\n", i == 0 ? "array3" : "", &array3[i], array3[i]);
    }

    for (int i = 0; i < sizeof(array_pointers) / sizeof(array_pointers[0]); i++) {
        printf("%-10s %08p: %016p\n", i == 0 ? "array_poin" : "", &array_pointers[i], array_pointers[i]);
    }

    printf("%-10s %08p: %016p\n", "array_poi2", &array_pointers2, array_pointers2);

    return 0;
}

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Was ist die Zeitkomplexität von Java 14+ Arrays.sort( int[] ) im schlimmsten Fall?

Warum kann die Größe des Array von Zeigern im Funktionsaufruf nicht gefunden werden?

ArrayList des zweidimensionalen Arrays int

Konvertieren des primitiven Arrays von int in ArrayList in Java: "java.lang.ClassCastException: [Ich kann nicht in java.lang.Integer umgewandelt werden"

Das Array von Zeigern in einer Funktion wird nicht auf den richtigen Werten des im Aufruf verwendeten Arrays angezeigt

Konvertieren des Swift-Arrays von [Int64] in NSArray

Ich habe die Antwort darauf nicht gefunden, warum beeinflusst die Weiterführung im Switch-Fall die Schleife außerhalb des Switches, aber break "unterbricht" die Schleife nicht?

realloc() ändert die Größe des Arrays von Zeigern nicht

Durchlaufen des Arrays mithilfe von Zeigern

Python-Funktion, die über die Liste iteriert oder im Fall von int nur int übernimmt

Problem beim Konvertieren von float in int beim Berechnen des Medians von zwei sortierten Arrays

Verwendung von enum im Switch-Fall, aber nicht als Switch-Argument

Ich kann in Java im folgenden Code nicht int in boolean konvertieren

Warum wird der Standardwert eines Klassenmitglieds bei Verwendung von Zeigern nicht verwendet, im Gegensatz zur direkten Instanziierung des Objekts?

Konvertieren eines zweidimensionalen Arrays von Floats in Bools

Warum funktioniert die Eingabe des Scrollrads nur im alternativen Fall?

Warum ist das dereferenzierte Element im const-Vektor von int-Zeigern veränderlich?

Warum werden durch Malloc zugewiesene Speicherwerte mit i++ anstelle von i+4 zugewiesen (im Fall einer int-Größe von 4 Byte)?

Java "Typkonflikt: Konvertierung von int [] [] nach int nicht möglich" bei Rückgabe des kopierten Arrays

Wie kann ich für jede Absicht im Fall von no.input eine benutzerdefinierte Eingabeaufforderung bereitstellen?

Instanz von im Fall von Funktion in JavaScript

Wie kann ich einige Werte von Arrays im Tensorflow erhalten?

Ein Fall von "Alle Goroutinen schlafen - Deadlock!" Ich kann nicht herausfinden, warum

Ändern des Datentyps des Pandas-Arrays von obj in int

Zuweisen von Zeigern zu Variablen im Vergleich zum Zuweisen von Zeigern zu Arrays in C.

Warum kann ich das nicht in Int konvertieren?

Wie finde ich in diesem Fall den Mindestindex des Arrays?

Warum unterscheidet sich die Größe des int-Zeigers von der Größe des int-Arrays?

c ++ int Zeiger auf Array von Zeigern auf Arrays Speicherlecks

TOP Liste

  1. 1

    Glassfish v3.0.1 im Vergleich zu Oracle GlassFish Server 3.0.1 - Gibt es einen technischen Grund, die kommerzielle Version zu verwenden?

  2. 2

    Wie schließe ich mehrere Ordner mit der Variablen EXTRA_ARGS aus?

  3. 3

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  4. 4

    Modbus Python Schneider PM5300

  5. 5

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  6. 6

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  7. 7

    Wie füge ich eine Spalte in einer Zeile in der Ansible Jinja2-Vorlage mit der for-Schleife hinzu?

  8. 8

    ElasticSearch - Knotensperren konnten nicht abgerufen werden

  9. 9

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  10. 10

    Wie vergleicht man scala.xml-Knoten richtig?

  11. 11

    Wie kann man eine Multi-Container-Anwendung in Steuerkarten erstellen?

  12. 12

    Wie Verwenden von Httpclient mit jedem SSL-Zertifikat, egal wie „schlecht“ es ist

  13. 13

    HTTPS-Verbindung mit Moneris-Servern in Curl

  14. 14

    Elasticsearch startet nicht nach dem Laden in viele Daten

  15. 15

    Schneller Algorithmus zum Suchen nach Teilzeichenfolgen in einer Zeichenfolge

  16. 16

    So übergeben Sie eine Variable in json, um Daten zu erhalten

  17. 17

    Hervorheben der SQL-Syntax in Visual Studio 2017

  18. 18

    Unterschied zwischen einfachen und doppelten Anführungszeichen in Javascript

  19. 19

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  20. 20

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  21. 21

    Bester Crawler, um festzustellen, ob er mit Technologien gebaut wurde?

heißlabel

Archiv