Brauche Hilfe bei Lösungen
-
Hallo,
ich hätte da gerne mal ein paar fragen zu Aufgaben aus meinem C++ Buch.Aufgabe: typedef für folgende variablentypen benutzen:
unsigned char const unsigned char Zeiger auf Integer Zeiger auf Zeiger auf Char Zeiger auf Feld von Char Feld von 7 Zeigern auf Integer Zeiger auf Feld von 7 Zeigern auf Integer Feld von 8 Feldern von 7 Zeigern auf IntDas habe ich nun so gelöst:
typedef unsigned char uchar; // unsigned char typedef const unsigned char conuchar; // const unsigned char typedef int* iPtr; // Zeiger auf Integer typedef char** cPtrPtr; // Zeiger auf Zeiger auf Char typedef char*(*CharArrayPtr)[] ; // Zeiger auf Feld von Char typedef int* sevenIntPtr [7]; // Feld von 7 Zeigern auf Integer typedef int* (*ptrToArrayOfSevenInt[7] ); // Zeiger auf Feld von 7 Zeigern auf Integer typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf IntegerNun möchte ich von euch wissen, ob ich die Variablen richtig ausgeschrieben habe (besonders bei den letzten 2 war ich mir unsicher).
-
Schummel einfach. (link von SeppJ geklaut)
-
typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf Integer
Nee.
Typelesen geht so:Man liest den Bezeichner
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist...Und dann immer rechts vor links, außer eine überraschende runde Klammern zwingt einen, erst drinnen zu bleiben.
Also gehts nach rechts.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7...Ah, die Klammer.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7 Zeigern auf...So, in der Klammer ist alles gelesen, kann weg.
int* ((*WeirdVar[7])[8]) [];Rechts gehts weiter, rechts vor links.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7 Zeigern auf Array von 8...Überraschende klammer, ich suche also links, oh, da ist nix mehr, diese Klammer war wohl gar nicht nötig.
int* *((WeirdVar[7])[8]) [];
Weiter rechts.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von...int*** ((*WeirdVar[7])[8]) []**;
WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf...int ((*WeirdVar[7])[8]) []*;
WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf int.Also das Lesen geht ganz mechanisch. Das Schreiben nicht, aber egal, kannst ja ein wenig fummeln und es ja immer durch Lesen prüfen.
-
Trampeltier schrieb:
Hallo,
ich hätte da gerne mal ein paar fragen zu Aufgaben aus meinem C++ Buch.Aufgabe: typedef für folgende variablentypen benutzen:
unsigned char const unsigned char Zeiger auf Integer Zeiger auf Zeiger auf Char Zeiger auf Feld von Char Feld von 7 Zeigern auf Integer Zeiger auf Feld von 7 Zeigern auf Integer Feld von 8 Feldern von 7 Zeigern auf IntDas habe ich nun so gelöst:
typedef unsigned char uchar; // unsigned char typedef const unsigned char conuchar; // const unsigned char typedef int* iPtr; // Zeiger auf Integer typedef char** cPtrPtr; // Zeiger auf Zeiger auf Char typedef char*(*CharArrayPtr)[] ; // Zeiger auf Feld von Char typedef int* sevenIntPtr [7]; // Feld von 7 Zeigern auf Integer typedef int* (*ptrToArrayOfSevenInt[7] ); // Zeiger auf Feld von 7 Zeigern auf Integer typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf IntegerNun möchte ich von euch wissen, ob ich die Variablen richtig ausgeschrieben habe (besonders bei den letzten 2 war ich mir unsicher).
Die letzten beiden kannst Du einfacher schreiben, indem Du dich auf das drittletzte beziehst:
typedef sevenIntPtr *ptrToArrayOfSevenInt; typedef sevenIntPtr WeirdVar[8];
-
typedef char*(*CharArrayPtr)[] ; // Zeiger auf Feld von CharNein, Zeiger auf ein Array von Zeigern auf char.
-
Trampeltier schrieb:
typedef const unsigned char conuchar; // const unsigned charEs wäre keine überaus törichte Idee, Dir das const gleich an der neuen Stelle anzugewöhnen.
Nach Typenleseregel, vom Beizericher aus loslesen nach außen:
int const * px;
px ist ein Zeiger auf konstanten int.
Also *px=5 geht nicht, aber px=&y.int * const px;
px ist konstanter Zeiger auf int.
Also *px=5 geht, nicht aber px=&y.int const * const px;
px ist konstanter Zeiger auf konstanten int.
Beides geht nicht.Die alte Schreibweise
const int * const x;
x ist konstanter Zeiger auf int, der konstant ist, ist doch unhüsch.void foo(Auto const& a);
//Ein Auto wird genommen, und zwar als Übergabe per const&. Die const&-Übergabe ist zu sehen wie Wertübergabe, nur schneller (wenn das a nicht kaputtgemacht werden darf). Als Übergaben haben wir
(Auto a)//Kopie, evtl in Sachen C++11 fürs wegmoven optrimiert
(Auto* a)//Die Aufgerufene soll ändern können
(Auto const* a)//verwende ich nicht
(Auto &a)//Die Aufgerufene soll ändern können, und &a ist nicht NULL//verwende ich auch nicht
(Auto const& a)//Fühlt sich an wie Kopie, keine move-OptimierungMit dem neuen const steht auch die Aufrufweise zusammen, statt daß man sie sich von vor und hinter dem Auto zusammensuchen muss.
-
const int * const x;Verboten

(Auto const* a)//verwende ich nichtNa, aber das ist doch "optionales Argument das konstant ist". Oder nutzt man in diesem konkreten Fall sowieso nie
const? soweit ich mich erinnere "will man ja keine Information ueber die Implementierung nach aussen geben"(?)(Auto &a) //verwende ich auch nichtWieso nicht!? Wie nimmst du sonst eine veraenderbare Referenz eines Objektes? Doch nicht standardmaessig mit Zeigern?
(Auto const& a)//Fühlt sich an wie Kopie, keine move-Optimierung
Das Problem ist, dass es zwei Moeglichkeiten gibt, was passiert, wenn ich eine Const-Referenz initialisiere: Entweder sie bindet direkt (weder Move noch Kopie), oder es wird eine Temporary erstellt, welche mit dem Initializer der Referenz kopierinitialisiert wird, das passiert aber nur bei prvalues - und das fuehrt zu Moves (wenn moeglich, sonst Kopie). Also muss nichts kopiert werden (wenn Moves moeglich sind).
-
volkard schrieb:
typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf Integer
Nee.
Typelesen geht so:Man liest den Bezeichner
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist...Und dann immer rechts vor links, außer eine überraschende runde Klammern zwingt einen, erst drinnen zu bleiben.
Also gehts nach rechts.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7...Ah, die Klammer.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7 Zeigern auf...So, in der Klammer ist alles gelesen, kann weg.
int* ((*WeirdVar[7])[8]) [];Rechts gehts weiter, rechts vor links.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7 Zeigern auf Array von 8...Überraschende klammer, ich suche also links, oh, da ist nix mehr, diese Klammer war wohl gar nicht nötig.
int* *((WeirdVar[7])[8]) [];
Weiter rechts.
int* ((*WeirdVar[7])[8]) [];
WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von...int*** ((*WeirdVar[7])[8]) []**;
WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf...int ((*WeirdVar[7])[8]) []*;
WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf int.Also das Lesen geht ganz mechanisch. Das Schreiben nicht, aber egal, kannst ja ein wenig fummeln und es ja immer durch Lesen prüfen.
Also ist folgendes korrekt?:
typedef int* ((WeirdVar[])[8]) [7]; //Feld von 8 Feldern von 7 Zeigern auf IntegerIch weiß nicht, was mit "Feld von 8 Feldern von 7 Zeigern auf Integer" gemeint ist.
Entweder obriges oder möglicherweise dies?:typedef int* WeirdVar[8][7];Wobei das Zweite ein zweidimensionaler Array ist.
Die Aufgabe ist möglicherweise etwas schlecht formuliert, das fällt mir bei dem Buch auch insgesamt ein bisschen auf. Es heißt "Die C++ Programmiersprache von Bjarne Stroustrup".
Das Originale Buch im Englischen ist wahrscheinlich verständlicher, da ich mir vorstellen kann, dass so ein Buch über eine Programmiersprache ziemlich schwer ist, zu übersetzen.