Aus der FAQ: Call by Value <-> Call by Reference

Status
Nicht offen für weitere Antworten.

helium

Mitglied
In dem Thread geht es darum, dass Java Referenzen by Value übergibt (was natürlich richtig ist). Aber dann kommt ein Beispiel in C++ und dann eins in C und das in C ist falsch!
C übergibt Zeiger by Value, genauso, wie Java Referenzen by Value übergibt.

Code:
int test (char *query) { 
// do something 
  query++; 
}
Diese Funktion hat absolut keinen Effekt, da der Zeiger by Value übergeben wird und nur eine lokale Kopie verändert wird. Wenn man in C bleiben will müsste man Zeiger auf Zeiger verwenden, in C++ würde man eine Referenz auf einen Zeiger verwenden.

Code:
int test (char **query) { 
// do something 
  (*query)++; 
}
 
S

stev.glasow

Gast
Wieso postest du das jetzt? Sollte das ein extra Thread werden?
[edit]
Ah sorry, Irrtum meiner Seits.
 
B

bygones

Gast
mhm - das hat ja gedauert, dass es einem aufgefallen ist. Danke helium... wusste doch, dass mein C Kenntnisse ziemlich brach liegen..

wie heißt richtig ?
 
C

c-newbie

Gast
Ganz dumme Frage:

Kann man in C einen Zeiger erstellen, der auf einen Zeiger zeigt, der aber schon auf diesen Zeiger zeigt;

also ein Kreislauf von Zeigern, was gibt das?

Tschüß
 

thE_29

Top Contributor
Recht hat er, aber das ist Blödsinn

Code:
int test (char **query) {
// do something
  (*query)++;
}

1. fehlt sowieso mal das return
2. man braucht nur 1 *

in C/C++ kannst du viel rumzeigen. ZB ist eine Klasse die eine Referenz ist die Funktion nicht mehr mit . aufrufen sondern mit -> ;)
->* usw gibts alles, was dann ziemlich schnell ziemlich verwirrend wird.

Code:
int test (char *query) {
// do something
  (*query)++;
  return 0;
}

so isses richtig, das von helium oben genannte Bsp macht 1:1 das gleiche wie dbacs, nämlich Speicheränderung!!

Es wird weder der Wert noch sonstiges geändert, sondern der Speicher wird weitergeschoben, sodass es auf was anderes zeigt (natürlich nur in der Funktion).

Dh, er springt einfach ein char (also 2 Bytes) im Speicher weiter. Was natürlich net wirklich was macht, aber so isses mit C/C++. Das macht halt alles was du halt sagst ;)

So ist auch

Code:
int test (char *query) {
// do something
  *query++;
return 0;
}

falsch, da der auch nur den Speicher weiterschiebt!!

Also das richtige ist das was ich oben schon gepostet habe (und hier nochmal)

Code:
void test (char *query) {
// do something
  (*query)++;
}

Ich würds void nehmen, da man keinen Rückgabewert braucht!




Nachtrag2: jetzt weiß ich auch was helium meint und dbacs Bsp ist falsch :bae: Ich dachte du willst nur eine Variable ändern und net verschieben ;)
 

thE_29

Top Contributor
So, jetzt mit Bsp ;)

Code:
#include <stdio.h>
void test1(char *);
void test2(char  **);


int main(int argc, char* argv[])
{
        char *ptr= new char[10]; //bisi mehr vereinbaren
	ptr="HALLO";
	test1(ptr);
	printf("Main: %s\n",ptr);
	test2(&ptr);
	printf("Main: %s\n",ptr);
	return 0;
}

void test1 (char *query) 
{
	query++;
	printf("test1: %s\n",query);
}

void test2 (char **query)
{
	(*query)++;
	printf("test2: %s\n",*query);
}

Ausgabe:
test1: ALLO
Main: HALLO
test2: ALLO
Main: ALLO

Hoffe jetzt verstehts jeder ein bisi :bae:
 

helium

Mitglied
Kann man in C einen Zeiger erstellen, der auf einen Zeiger zeigt, der aber schon auf diesen Zeiger zeigt;

also ein Kreislauf von Zeigern, was gibt das?

Ein Zeiger auf einen Zeiger kann nur auf einfache Zeiger zeigen. Du willst aber auf einen Zeiger auf einen Zeiger Zeigen, was nicht geht (außer mit schmutzigen Casts).
Allerdings sehe ich da keinen sinn drin.


1. fehlt sowieso mal das return
Jo, Copy&Paste lässt grüßen :roll:



Und zu letzten Beispiel: C++ hat keinen GC. Bei dir fehlt das delete. Aber wieso überhaupt ein Feld au dem Heap?
und wenn schon C++, warum dann <stdio.h> und nicht <cstdio> bzw. gleich die iostreams?
 

thE_29

Top Contributor
zeig mir 1 Zeile was da C++ ist!

und cstdio hab ich noch nie gehört ;)

und die 10 bytes musste ich ja net wirklich freigeben ;>


Und das C++ keinen GC hat das weiß ich auch, ich hab C/C++ gelernt und bin so zu Java gekommen (~Destruktor)

Aber da ist einfach nix c++ also hätte ich zum Schluss halt ein delete machen müssen, aber es war ja nur ein Testprogramm ;>
 

helium

Mitglied
C hat kein new!!!

In C kann man malloc oder calloc verwenden, um dynamisch Speicher zu allokieren.


Und man gibt Speicher prinzipiell frei. Denk nicht darüber nach, worum es sich handelt oder sonstwas. Gewöhn es dir einfach an, so dass es ein Reflex wird, falls du überhaupt noch mit C++ arbeitest.

und cstdio hab ich noch nie gehört
Hu? C++ das letzte mal vor 1998 programmiert? Also in C gibt es eine Reihe von Headern, wie <stdio.h>, <math.h>, etc. Diese Header stehen unter C++ ebenfalls zur Verfügung, allerdings ohne '.h' und dafür mit einem vorangestellten 'c'. Der Inhalt ist quasi der selbe, bis auf das sich alles im Namensraum 'std' befindet.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java - Call by value <-> Call by reference Allgemeine Java-Themen 16
MQue call by value Allgemeine Java-Themen 5
P call by value/referenz Allgemeine Java-Themen 4
N Sieht aus wie ein "Call by Referece/Call by Value" Allgemeine Java-Themen 7
S Call by Value Allgemeine Java-Themen 9
A Java Call-Hierarchie Allgemeine Java-Themen 2
V JNI Call Crash verhindern (abfangen) Allgemeine Java-Themen 2
E wie call by reference mit Wrapper-Klassen? Allgemeine Java-Themen 2
K Als Rückgabewert ode call by referenz was ist sauberer? Allgemeine Java-Themen 12
J InvocationException im Thread (innerhalb von call() einer Callable Klasse) Allgemeine Java-Themen 2
hdi ClassLoader / Constructor Call intern Allgemeine Java-Themen 11
S Performance und Function Call Depth Allgemeine Java-Themen 6
S Active-X Call / Invoke?` Allgemeine Java-Themen 7
sliwalker Call by Reference - Was stimmt denn nun ? Allgemeine Java-Themen 14
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
M Thymeleaf th value und th text Allgemeine Java-Themen 1
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S @Value mit bestimmt Werten, sonst default Allgemeine Java-Themen 42
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
B HashMap aus Value Key bekommen Allgemeine Java-Themen 2
F Unterschied zwischen NormalizedValue und Value Allgemeine Java-Themen 5
Q For-Schleife in String-Value Allgemeine Java-Themen 3
L Variablen HashMap nimmt value nicht an Allgemeine Java-Themen 3
B Load of Known null Value Allgemeine Java-Themen 9
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
algorismi int-variable Value Change event Allgemeine Java-Themen 3
G HTTP key-value-paar Allgemeine Java-Themen 8
J Map nach value sortieren Allgemeine Java-Themen 14
G Verschachtelte Treemaps, nach Value sortieren Allgemeine Java-Themen 11
faetzminator Regex zur Suche von "value-losen" Attributen in HTML Tags Allgemeine Java-Themen 7
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
S Map die die auch ein getKey(value) erlaubt? Allgemeine Java-Themen 2
F Javadoc: @value tag nicht für private fields? Allgemeine Java-Themen 11
T [TreeMap] Corresponding value to a key Allgemeine Java-Themen 10
V Objekt aus Session als copy by value bekommen Allgemeine Java-Themen 4
R Wert in Hashtable ändern (Key ändern, Value bleibt) Allgemeine Java-Themen 3
C Map(Key/Value) mit mehreren Values Allgemeine Java-Themen 16
M Value als String in beliebige Klasse konvertieren Allgemeine Java-Themen 18
Fredy Return by value mit String?? Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben