Adreßtypen in C++
Adreßtypen
Eine Variable »W « mit dem Typ der Adresse einer Variablen »V « kann erhalten werden, indem »( *W )« an der Stelle von »V « in die Deklaration der Variablen »V « eingesetzt wird.
(Im voranstehenden Satze stehen »W « und »V « für die jeweiligen Namen zweier Variablen.)
Ist beispielsweise »int v;« die Deklaration einer Variablen »v«, so erhält man durch Ersetzung von »v« durch »( *w )« die neue Deklaration »int ( *w );«. Diese deklariert »w« nun so, daß es den richtigen Typ hat, um die Adresse »&v« aufzunehmen.
In dem folgenden Programm wird auf diese Weise eine Variablen »w« deklariert, so daß ihr Typ den Typ von »&v« hat.
Dieser Variablen »w« wird dann mit der Adresse der Variablen »v« initialisiert. Danach kann dann später mit »( *w )« wieder das Objekt zu der Adresse »w« erhalten werden. »( *w )« bedeutet also soviel wie »v«. In dem Programm wird der Wert dieses Objekt dann beispielsweise zur Initialisierung der Variablen »u« verwendet.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ int v { 31 };
int ( *w ) { &v };
int u { ( *w ) };
::std::cout << u << "\n"s; }Protokoll
31
::std::cout
31
Die Bedeutung von »int( *w );« ergibt sich einfach daraus, daß der Ausdruck »( *w )« den Typ »int« haben soll, also: »int ( *w );«.
Wenn die Klammern nicht nötig sind, um zu verdeutlichen, daß »*w« eine Einheit bilden soll, können sie entfallen. Dies ist beispielsweise in dem folgenden Fall möglich, wo »*p« verwendet wird. Dort ist es nicht nötig, »( *p )« zu verwenden.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ int i { 2 };
int *p { &i };
int k { *p };
::std::cout << k << "\n"s; }Protokoll
2
Man hier »int *p« also so lesen, daß »*p« den Typ »int« hat oder so daß »p« den Typ »int *« hat.
Der Typ einer Adresse wird auch ein Adreßtyp (address type) genannt.
»auto«
Es ist auch möglich, den Typ einer Adresse durch »auto« automatisch festlegen zu lassen.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ auto i { 4 };
auto p { &i };
::std::cout << *p << "\n"s; }Protokoll
4
Im voranstehenden Programm erhält die Variable »p« automatisch den Typ des Ausdrucks »&i«, also »int *«.
»auto *«
Bei Verwendung von »auto *« wird für »auto« automatisch der richtige Typ eingesetzt, in dem folgenden Beispiel »int«. Der Stern im Quelltext verdeutlicht, daß es sich um eine Adresse handelt.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ auto i { 4 };
auto * p { &i };
::std::cout << *p << "\n"s; }Protokoll
4
Auch im voranstehenden Programm erhält die Variable »p« wieder automatisch den Typ des Ausdrucks »&i«, also »int *«.
Skalare Typen
Die arithmetischen Typen (wie »int« und »double«) werden mit den Adreßtypen (wie »int *«) zusammengefaßt als skalare Typen bezeichnet.
- C++ 2015 3.0p9
- Arithmetic types [and] (…) pointer types (…) are collectively called scalar types.
Übungsfragen
? Übungsfrage
Ist das folgende Programm korrekt?
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ int i = 2;
int *p = &i;
*p = &i;
::std::cout << *p << "\n"s; }