right - void pointer cast c++




Warum ist int*ptr_arr_int={1,2}; funktioniert nicht in C/C++? (5)

Dies ist nicht möglich, da int * keine Struktur ist, die mit zwei Werten wie mit = {1,2}; initialisiert werden kann = {1,2}; .

Du hättest es so initialisieren können:

int * ptr_arr_int = nullptr;

Die andere Möglichkeit besteht darin, ein Objekt zu verwenden, das zwei Konstruktionswerte erwartet:

struct Point
{
    int a;
    int b;
};

dann hättest du schreiben können:

Point p = {1,2};

Warum ist int* ptr_arr_int = {1,2}; gibt einen Compilerfehler aus, wohingegen char* ptr_arr_char = "amruth"; Kompiliert gut?

int* ptr_arr_int = {1,2};         // ->ERROR
char* ptr_arr_char = "amruth";    // ->OK

Ein String an sich impliziert bereits eine Speicherklasse - es ist ein static (+ effektiv const ) char Array, das mit einer speziellen Syntax deklariert wurde.

Im Gegensatz dazu ist nicht klar, wie {1, 2} in int *ptr_arr_int = {1, 2} gespeichert werden soll. Sollte es static oder auto ?

Wenn Sie möchten, dass es auto in einem lokalen Bereich oder static in einem Dateibereich ausgeführt wird, können Sie in C> = 99 explizit int *ptr_arr_int = &(int[]){1,2}[0]; (das &[0] ist optional).

Sie könnten dies möglicherweise implizieren, aber wie weit würden Sie damit gehen? int ****x = {1,2}; Initialisiert durch Erstellen eines Arrays, eines Zeigers darauf, eines Zeigers darauf usw., kann dies zu einer Menge Code / Daten führen, und das Verbergen einer Menge Code / Daten unter einem einfachen Konstrukt ist nicht ganz die C-Methode. Es wäre auch nicht klar, wann die geschweifte Klammer den endgültigen Ziel-Basistyp oder einen Teil der Zwischenzeiger initialisieren sollte.


Nein ... das stimmt nicht ... dieser Initialisierer ist nur für Arrays gültig. Hatten Sie geschrieben:

int array[] = {1, 2};

es wäre gültig ... aber Sie versuchen, eine Zeigervariable zu initialisieren, daher wäre dies gültig (trotz der Warnung, da 0xf45 keine Adresse ist):

int *pointer = { 0xf45 };

(weil Sie nur einen einzigen Eintrag eingeben und dieser als ein einziger Wert betrachtet wird), aber:

int *pointer = { 0xf45, 0 };

(Sie erhalten eine weitere Warnung zu excess elements in scalar initializer ) Dies bedeutet, dass Sie für eine einzelne Variable versucht haben, zwei Initialisierer zu verwenden. Die geschweifte Klammer wurde geboren, um Arrays initialisieren zu können, darf aber auch mit skalaren Typen verwendet werden. Dies bedeutet, dass die beiden Notationen:

{ 0 }; /* a single value between braces */

und

0;

sind gleichwertig.

Die Lösung für Ihr Problem besteht darin, einen zusätzlichen Schritt auszuführen, ein Array zu deklarieren und dann mit dem Zeiger darauf zu zeigen:

int array[] = {1, 2};

int *pointer = array;

Denken Sie jedoch, dass Sie einen Zeiger auf eine andere Stelle als den Anfang des Arrays setzen und das Array nicht auf magische Weise an eine andere Stelle verschieben können. Und &array bedeutet die Adresse von array array während &pointer die Adresse des &pointer bedeutet. pointer zeigt auf die Adresse des array , aber das array ist ein konstanter Zeiger, der auf die Adresse des array[0] .

Zeiger und Arrays sind etwas verwirrend, aber denken Sie niemals, dass sie dasselbe sind. Vergleichen Sie sizeof(char[120]) mit sizeof(char *) und Sie werden sehen.


Sie deklarieren ein Array von Zeigern auf int ( int* ). Die Werte, mit denen Sie das Array initialisieren ( 1 und 2 ), sind jedoch keine Zeiger auf Ganzzahlen, sondern einfache Ganzzahlen.


"amruth" ist ein const char[7] -Typ in C ++ und ein char[7] -Typ in C (obwohl das Verhalten beim Versuch, die Zeichenfolge zu ändern, undefiniert ist).

Dies kann unter bestimmten Umständen, z. B. bei Ihnen, zu einem const char* oder char* -Typ werden.

Obwohl ein int[2] unter bestimmten Umständen ähnlich wie ein int* zerfällt, ist {1, 2} weder ein int[2] noch ein const int[2] -Typ; Vielmehr ist es ein Klammer-Initialisierer .







pointers