BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C C Makro » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen C Makro
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
black1654 black1654 ist männlich
der Vagabund


Dabei seit: 06.09.2001
Beiträge: 1.008
Herkunft: Hochdahl (bei Düsseldorf)

C Makro       Zum Anfang der Seite springen

Tut mir leid, dass ich zurzeit so wenig, bzw. gar nicht hier bin... Aber ich bin derzeit unteranderem viel am lernen wobei wir direkt beim Thema wären.

Ich habe hier in C folgendes kleines Makro.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
#include <stdio.h>

#define P(x) printf(""#x" = %d\n", x)

void main (void)
{
	int a[] = {11, 21, 31, 41, 51};
	int i=5, j=7, k=9, l=11;

	int b[2][3] = {{10, 20}, {30, 40}};

	int *c[4] = { &i, &j, &k, &l};

	int (*d) [3] = b;

	int *e = a;

	P(a[1]);  
	P(*a+1);  
	P(e[1]);  
	P(b[1][2]);  
	P(*c[2]);
	P(*d[1]);   //30
	P((*d)[1]); //20
	P(*(*d+1)); // 20
}


Ich habe mit dem P(*d) probleme, ich kann damit nichts anfangen und folglich weiss ich auch nicht, wie man auf die letzten 3 Ausgabewerte kommt. Kann mir das jemand erklären?

lg
Micha

edit
naja, ich habs mir mal versucht selbst zu erklären, weiss nur nich ob das richtig ist.

P(*d[1]); bedeutet, dass die erste Deminsion 1 ist und da sonst nichts mehr folg ist die zweite dimension Null, was die 30 ergibt.

bei P((*d)[1]); ist die erste Dimension Null und die zweite 1, was die 20 ergeben würde.

im dritten Fall wird die 2. Dimension durch *d +1 auf 1 gesetzt und die erste deminsion ist durch das sternchen mit 0 angegeben.

kann das jemand irgendwie dokumentieren? Ja, ich weiss, dass ist jetzt keine Fachsprache gewesen großes Grinsen

__________________
Ich danke allen, die mich bestohlen, betrogen, belogen, verraten, verletzt,
sabotiert, kopiert, boykottiert oder vergessen haben.

Ihr habt mir gezeigt, dass man an sich und seinem Charackter hart arbeiten muss

05.02.2006 21:18 black1654 ist offline E-Mail an black1654 senden Beiträge von black1654 suchen
Black Star Black Star ist männlich
Der Pate [Admin]


images/avatars/avatar-2158.jpg

Dabei seit: 11.12.2001
Beiträge: 2.282
Herkunft: /dev/stderr

      Zum Anfang der Seite springen

Nunja. Ich geb auch mal einen Deutungsversuch ab und uebernehme natuerlich keinerlei Haftung.

b ist ein int** Objekt, also ein Zeiger auf Zeiger von int.
das sieht in ascii-Art dann etwa so aus (Denk dir die blauen striche einfach weg, aber die CODE-BB tags schlucken die COLOR-tags):

b -> int* -> int*
______|_____ |
_____10_____30
______|_____ |
_____20_____40
______|_____ |
_____nicht initialisiert

Jetzt definiere ich d als Zeiger-Objekt auf int (*d), und gebe ihm mit [3] noch eine zweite Dimension, also ist d genau wie b ein Zeiger-Objekt auf Zeiger, die auf ein 3-Dimensionales int-Array zeigen.

*d ist das, worauf d zeigt, alse der rote Zeiger. Mit *d[1] oder *(d[1]) - da [] eine hoehere Prioritaet als * hat - bekomme ich halt das, worauf d[1] (blau) zeigt. Das ist 30.
Mit (*d)[1] beziehe ich mich auf das Array, das daran haengt, worauf d zeigt. Also die 2. Position in *d, also [1] vom roten Array, also 20.
Das letzte saehe vollstaendig geklammert so aus: (*((*d)+1))). Und jetzt von innen nach aussen. *d ist der Zeiger, auf den d zeigt, also der rote. **d waere das, worauf der rote Zeiger deutet, also 10. *d+1 ist (fast) das selbe, wie (*d)[1], mit der Ausnahme, dass es sich dabei um einen Zeiger auf das zweite Objekt in *d (rot) handelt. Da wir die Zahl und nicht den Zeiger haben wollen, muss noch ein * davor. Also *(*d+1). Dies ist identisch zu der Schreibweise (*d)[1], wird aber in aller Regel nicht benutzt, weil die []-Schreibweise leichter verstaendlich ist.
Ausnahme ist, wenn man mit ++ oder -- durch die Objekte eines Zeigers springt. Etwa *b++ oder --(*b) oder *(++(*b))

__________________
vescere bracis meis

05.02.2006 23:37 Black Star ist offline E-Mail an Black Star senden Homepage von Black Star Beiträge von Black Star suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C C Makro

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH