BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- C C Makro (http://www.black-board.net/thread.php?threadid=21853)


Geschrieben von black1654 am 05.02.2006 um 21:18:

  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 großes Grinsen



Geschrieben von Black Star am 05.02.2006 um 23:37:

 

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))


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH