C Makro |
black1654
der Vagabund
Dabei seit: 06.09.2001
Beiträge: 1.008
Herkunft: Hochdahl (bei Düsseldorf)
|
|
C Makro |
|
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
__________________
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 |
|
|
Black Star
Der Pate [Admin]
Dabei seit: 11.12.2001
Beiträge: 2.282
Herkunft: /dev/stderr
|
|
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 |
|
|
|