zeiger in c?
ich verstehe zeiger einfach net hier in dem code z.b
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
int *name;
char geschlecht;
};
int main() {
struct student *student1 =malloc(sizeof (struct student));
if (student1 ==0){
printf("Kein Speicher ");
return -1;
}
student1->name= malloc(sizeof(char)*50);
if(student1->name==0){
printf("Kein Speciher");
return -1;
}
strcpy(student1->name,"Pal");
student1->geschlecht = 'w';
printf("Name :%s\n",student1->name);
printf("Gechlecht:%c\n",student1->geschlecht);
return 0;
}
welchen sinn hat welcher zeiger ?
struct student *student1
bezieht sich der zeiger auf struct student oder auf student1 ?Warum muss der überhaut dort hin
bzw wie würde man das am besten in worten ausdrücken? struct student zeigt auf student 1 aber selbst das sagt mir nicht was das heißen soll
5 Antworten
student1 ist ein Zeiger auf einen Wert vom Typ struct student.
Der Zeiger ist darum dort weil malloc einen Zeiger zurück gibt somit kann da nur ein Zeiger hin kommen.
Allerdings ist mir etwas schleiferhaft warum name hier als Datentyp int hat. Idr ist das ein char*
Würdest du den Source etwas umschreiben, wäre es für dich vielleicth leichter verständlich:
struct student* student1 =malloc(sizeof (struct student));
Wobei ich nicht glaube, dass das allererste struct notwendig ist.
Ok, danke für die Aufklärung. Ist schon etwas her bei mir. ;)
Kein Thema, die Tags von struct/union/enum haben einen eigenen (gemeinsamen) Namespace.
Zeiger sind Verweise - soweit so einfach.
struct student{
int *name; /* Das ollte eher char * name sein */
char geschlecht;
};
Zu Deiner Frage bezüglich:
struct student *student1 =malloc(sizeof (struct student));
student1 ist ein Zeiger auf einen struct student, es gibt da ein nettes Werkzeug, wenn man mal nen Hänger hat:
if (student1 ==0){
Auch wenn der C-Standard sagt, daß 0 einem NULL entsprechen soll, NULL wäre aussagekräftiger und wird eh zur Compilezeit ersetzt.
Randnotiz, Wenn Du NULL schon nicht ausschreibst, kannst du genauso gut:
if (!student1)
schreiben. Wenn schon dreckig, dann bitte richtig dreckig :-D.
also diese website ist ja echt mega nur was heißt jetzt
declare student1 as pointer to struct student? Sowie ich es versthe ist student1 ein zeiger auf den struct .Aber was genau macht des hat damit student1 zugriff auf den struct einfach ausgedrückt?
Ja, Du mußt allerdings student1 dereferenzieren, um auf die entsprechende struct zuzugreifen.
struct student person1; /* eine struct auf dem Stack */
struct student *student1; /* Zeiger auf eine struct vom Typ student.
student1=&person1; /* Hinterlege Adresse von struct person1 im Zeiger */
person1.geschlecht='W'; /* Zuweisung an person1 */
(*student1).geschlecht='M'; /* dito, * dereferenziert */
student1->geschlecht='D'; /* -> shorthand für (*). */
Am besten schaust Du Dir mal in einem brauchbaren Buch das Kapitel über Pointer udn Pointerarithmetik an.
Zeiger sind erstmal Variablen, die statt einem vorab typisierten Inhalt auf einen Speicherbereich zeigen.
Mit
struct student *student1
definierst Du einen Zeiger vom Typ struct student, der vorher definiert wurde und weißt diesem Zeiger einen Speicherbereich mit malloc() zu.
Du generelle Struktur des Codes finde ich etwas schwierig. Ich würde name eher als char(-Array) definieren und geschlecht eher als int bzw. als enum.
das mit dem name ist wohl ein fehler müsste ein char sein.
Die zwei Zeiger haben den Sinn, dass über sie Speicher auf dem Heap angefordert wird. Für den Namen würde ich ein Feld aus char , statt aus int nehmen.
Doch, das wird schon benötigt.