2016-08-03 9 views
2

Wenn ich int * num2 einen Wert geben möchte, wie würde ich das tun?Wie Zugriff und Zuweisung von Wert für einen int-Zeiger-Datentyp auf struct?

#include <stdio.h> 

int main(int argc, const char * argv[]) { 
    // insert code here... 
    struct az { 
     int num1; 
     int *num2; 
    }; 
    struct az test; 
    test.num1 =20; 
    printf("\n %d",test.num1); 
    return 0; 
} 
+1

sind Sie nicht sicher, wie mit einem 'int *' m zu bewältigen ember-Variable einer 'struct'- oder einer' int * '-Variablen an sich? –

+0

Sie würden es auf die gleiche Weise zuweisen wie Sie einen anderen Wert zuweisen. Mit dem Zuweisungsoperator ('='). Vielleicht meinst du * was * du ihm zuordnen solltest. Natürlich können wir das nicht beantworten, da nur Sie selbst entscheiden können, was das Programm tun soll (genauso können wir Ihnen nicht sagen, dass "num1" "30" und nicht "20" sein sollte). Das einzige, was wir sagen können, ist, dass der Wert ein "int" -Zeiger sein muss. Häufige Quellen: 'malloc' Aufruf oder Adresse einer bestehenden' int' Variablen. – kaylum

Antwort

0

Um einen Wert der ganzen Zahl zuweisen, dass test.num2 Punkte zu können, müssen Sie den Zeiger mit einem Stern de-reference, etwa so:

test.num2 = new int(20); // Allocates memory and sets the pointer to this memory 
*(test.num2) = 10; // Assign a value of 10 to the int that test.num2 points to 

eine Adresse an den Zeiger zuzuweisen, müssen Sie entweder einen anderen Zeiger auf zuweisen, oder weisen sie Wert durch einen int mit einem Ampersand Referenzierung:

test.num2 = new int(20); // Allocates memory and sets the pointer to this location 
int *ptr = new int(10); 
delete test.num2; // Free memory that test.num2 pointed to 
test.num2 = ptr // Makes test.num2 point to the same int as ptr 
int x = 10; 
test.num2 = &x; // Makes test.num2 point to x 
+0

* (test.num2) = 20; Das ist UB. Sie müssen zuerst Speicher reservieren –

+0

Guter Punkt, behoben. – naffarn

+0

Bitte nicht neu und kostenlos im selben Code mischen. malloc && frei || new && delete –

1

int *num2; ist ein Zeiger auf einen Ort, in den Speicher, enthält einen int Wert. Da Sie einfach einen Zeiger ohne Speicherzuweisung deklarieren, ist es einfach auf nichts (oder einen zufälligen Ort) gerichtet.

Sie haben Speicher zuweisen dann einen Wert zu diesem Speicher zuweisen: Jedoch

test.num2 =new int(20); 

, vergessen Sie nicht, diese zugewiesenen Speicher zu löschen, wenn Sie fertig sind:

delete test.num2; 

Die eigentliche Frage hier, Willst du den Zeiger wirklich hier? wahrscheinlich nicht.

0

Sie können num2 auf die gleiche Weise wie num1 zuweisen. Natürlich, es ist da keine int aber eine int*, können Sie nicht 20 zuweisen - die Adresse einiger int Variable statt zuordnen:

struct az { 
    int num1; 
    int *num2; 
}; 
struct az test; 
test.num1 = 20; 

int i; 
test.num2 = &i; 
0

In Ihrem Beispiel num2 wird typischerweise als ein gebrauchtes Zeiger auf ein dynamisch zugeordnetes Array. Jedoch ist weder num2 noch num1 ein guter Name in diesem Fall. Lassen Sie uns stattdessen unsere dynamische Array-Typ als ein Datensatz mit den Feldern Länge und Artikel erklären:

struct Array { 
    int length; 
    int *items; 
}; 
typedef struct Array Array; 

Wenn wir eine Variable haben ein vom Typ Array, bevor wir können die Werte ihrer Elemente zuweisen Wir müssen zuerst Speicher für das Array reservieren. In C erfolgt dies typischerweise mit der Funktion malloc. Diese Funktion ist jedoch ziemlich fehleranfällig zu verwenden, so ist es eine gute Idee ist, eine Makro-Funktion zu definieren, die Speicherzuweisung vereinfacht:

#define NEW_ARRAY(ptr, n) (ptr) = malloc((n) * sizeof (ptr)[0]) 

Nach NEW_ARRAY genannt haben, können wir Werte in das Array zuweisen:

int length; 
Array a; 

length = 20; 
a.length = length; 
NEW_ARRAY(a.items, length); 
a.items[0] = 37; 
a.items[1] = 19; 
... 

Wenn wir mit dem Array getan, was wir die Erinnerung durch die Elemente verwendet, freisetzen kann:

free(a.items);