# C Struct array aus Main in Funktionen aufrufen



## Napfton (7. Januar 2008)

Hallo!

Ich habe folgendes problem und zwar: ich würde gernen ein in main() deklariertes struct array an eine beliebige funktion mittels call-by-reference übergeben bzw dort verarbeiten, hab aber noch keinen erfolg gehabt geht das überhaupt?

mfg
Napfton


----------



## deepthroat (7. Januar 2008)

Hi.

Ein Array wird immer mit "Call-By-Reference" übergeben, da es im Grunde nur ein Zeiger ist.

Zeig deinen Code.

Gruß


----------



## Napfton (9. Januar 2008)

```
#include <stdio.h>

void moose( struct cows *a ){
	(*a).udder = 5;
}
int main(){
	struct cows {
		float milk;
		int udder;
	} cow, *zcow;
	int *preis, moo;
	printf("Bitte geben sie einen Wert fuer die Milch ein: ");
	zcow = &cow;
	moose(&cow);
	scanf("%f", &((*zcow).milk));
	printf("\n%10.2f\n", cow.milk);	
	return 0;
}
```

Das mit Zeigern und Arrays hab ich denk ich verstanden deepthroat, danke für den Hinweis!

Wie kann ich jetzt das struct aus main in moose benutzen?


----------



## Hillkorn (10. Januar 2008)

hm ne lösung wäre auch wenn du es zb so machst in programmen wobei dies dann kein zeiger wäre...


```
void void moose( struct cows (&a)[10] ) //für die 10 muss die größte des arrays rein
{
	a.udder = 5;
}
int main(){
        cows cow[10];
	mosse(cow);
}
```
das wär zb ne möglichtkeit.
bin mir grad nicht sicher aber man kann glaube statt des & auch ein * in der funktion schreiben dann wäre es halt ein pointer

hoffe mal hat geholfen

MFG Hillkorn


----------



## deepthroat (15. Januar 2008)

Napfton hat gesagt.:


> Das mit Zeigern und Arrays hab ich denk ich verstanden deepthroat, danke für den Hinweis!


Nee, du hast irgendwas nicht verstanden. Du hast ja gar kein Array in deinem Code... 

Erstmal mußt du das struct deklarieren bevor du es verwendest. D.h. du mußt es *vor *der Funktion moose deklarieren.

Beispiel:
	
	
	



```
struct cows { 
  float milk;
  int udder;
};

void moose(struct cows *a) {
  a[4].udder = 5;
}

int main() {
  struct cows cowsArray[10];

  moose(cowsArray);
}
```
Gruß


----------



## Napfton (28. Januar 2008)

Wow, sorry für die verpätete Antwort aber hab vergessen das ich hier gefragt hab! Es funktioniert mit deiner Lösung Deepthroat, find ich spitze, danke dir dafür. 

ich weiß zwar nicht wieso das geht wenn du die funktion einfach mit dem array aufrufst und nich mit der adresse des arrays aber ich finds spitze das es geht


----------



## deepthroat (28. Januar 2008)

Napfton hat gesagt.:


> ich weiß zwar nicht wieso das geht wenn du die funktion einfach mit dem array aufrufst und nich mit der adresse des arrays aber ich finds spitze das es geht


Ein Array ist nichts anderes als ein Zeiger. Es ist nicht möglich die Adresse dieses Zeigers zu ermitteln (sonst könnte man diesen Zeiger "verbiegen" und der Zeiger würde nicht mehr auf das Array zeigen). Der Adress-Operator hat bei Arrays keine Wirkung:

```
int a[20];
void *b = a, *c = &a;

(b == c) // True!
```
Gruß


----------

