Hallo zusammen
Ich habe ein paar Fragen dazu, wann ich Pointer und Referenzen in C und C++ verwende. Ich fange gerade erst an, mich etwas tiefgreifender mit dem Ganzen zu beschäftigen.
Also erstmal zu C, da gibts ja nur Pointer.
Ich verstehe, dass ich Pointer verwende, wenn ich die Speicheradresse brauche und nicht den Wert an der Adresse. Man braucht sie bei malloc und pass by reference. Aber hier mal ein paar konkrete Beispiele, die ich nicht 100% verstehe:
A) Was ist der Unterschied zwischen
und
?
B) Was ist bei structs der Unterschied zwischen:
und
Welchen Sinn hat es, einen Pointer zu verwenden, um auf das struct zuzugreifen?
C) Das hier ist aus dem Quellcode der TCP-Implementierung von Linux
Hier ist der Parameter addr_len kein Pointer, weil er nur dazu verwendet wird, einen Wertvergleich durchzuführen. Alle anderen sind Pointer, weil sie entweder an weitere Funktionen gereicht werden, die pointer verlangen oder weil sie by reference übergeben werden sollen, richtig?
D) In LinkedLists sind die Knoten wie next, temp etc. Pointer, weil sie auch den Wert null annehmen können, oder?
Dann zu Referenzen und Pointer in C++
Bei diesem SO-Post http://stackoverflow.com/questions/2...nter-or-valuea steht als Kommentar:
Also mal an diesem Beispiel: http://www.cplusplus.com/articles/LACRko23/, der Konnstruktor einer Node-Klasse
ptrnext ist ein Pointer, weil es den Wert null annehmen kann. item ist eine const reference, weil man hier nur den wert braucht, aber keine Kopie der Daten anfertigen will. Richtig?
Wann benutzt man denn dann überhaupt noch pass by value in C++? Ich kann ja auch bei Primitiven eine const reference übergebenl oder?
Und verstehe ich richtig, dass man in C++ dann Objekte prinzipiell als Referenzen anlegen soll und nur dann als Pointer, wenn unbedingt nötig? Also besser A) als B):
Wäre sehr dankbar für ein paar erhellende Worte
Ich habe ein paar Fragen dazu, wann ich Pointer und Referenzen in C und C++ verwende. Ich fange gerade erst an, mich etwas tiefgreifender mit dem Ganzen zu beschäftigen.
Also erstmal zu C, da gibts ja nur Pointer.
Ich verstehe, dass ich Pointer verwende, wenn ich die Speicheradresse brauche und nicht den Wert an der Adresse. Man braucht sie bei malloc und pass by reference. Aber hier mal ein paar konkrete Beispiele, die ich nicht 100% verstehe:
A) Was ist der Unterschied zwischen
Code:
char[] name = "Hans"
Code:
char* name = "Hans"
B) Was ist bei structs der Unterschied zwischen:
Code:
struct Books { int book_id; }; struct Books Book1; Book1.book_id = 1;
Code:
struct Books { int book_id; }; struct Book *eins = malloc(sizeof(struct Book)); eins->book_id = 1;
C) Das hier ist aus dem Quellcode der TCP-Implementierung von Linux
Code:
int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) 148{ 149 struct inet_sock *inet = inet_sk(sk); 150 struct tcp_sock *tp = tcp_sk(sk); 151 struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; 152 struct rtable *rt; 153 __be32 daddr, nexthop; 154 int tmp; 155 int err; 156 157 if (addr_len < sizeof(struct sockaddr_in)) 158 return -EINVAL;
D) In LinkedLists sind die Knoten wie next, temp etc. Pointer, weil sie auch den Wert null annehmen können, oder?
Dann zu Referenzen und Pointer in C++
Bei diesem SO-Post http://stackoverflow.com/questions/2...nter-or-valuea steht als Kommentar:
References are not necessary, they are syntactic sugar that makes it easier to use data without copying it without exposing you to raw pointers and their potential for abuse. You should use references any time you don't need to use pointers but need to change the data. You should use const references any time you only need the value but want to avoid creating a copy (as with pass-by-value)
Code:
Node(const T& item, Node<T>* ptrnext = NULL);
Wann benutzt man denn dann überhaupt noch pass by value in C++? Ich kann ja auch bei Primitiven eine const reference übergebenl oder?
Und verstehe ich richtig, dass man in C++ dann Objekte prinzipiell als Referenzen anlegen soll und nur dann als Pointer, wenn unbedingt nötig? Also besser A) als B):
Code:
A) Objekt instanz; B) Objekt *instanz = new Objekt();
Comment