42 Stimmen

Warum deklariere ich NSInteger nicht mit einem *

Ich versuche mich gerade an dem iPhone-Kurs von Stanford auf iTunes U und bin etwas verwirrt, was die Hinweise angeht. In der ersten Aufgabe habe ich versucht, so etwas wie das hier zu machen

NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

Das erzeugte einen Fehler, nachdem ich blind herumgebastelt hatte, entdeckte ich, dass es der * in der NSInteger-Zeile war, der das Problem verursachte.

Ich verstehe also offensichtlich nicht, was hier vor sich geht. Ich werde erklären, wie es meiner Meinung nach funktioniert, und vielleicht ist jemand so freundlich, mich auf den Fehler hinzuweisen.

Anders als bei der Webentwicklung brauche ich jetzt mehr als bei der Webentwicklung um den Speicher kümmern. Wenn ich also eine Variable erstelle, wird ihr irgendwo ein Speicherplatz zugewiesen (RAM, nehme ich nehme an). Anstatt die Variable weiterzugeben, gebe ich einen Zeiger auf dieses Stückchen Speicher weiter. Und Zeiger werden durch Voranstellen des Variablennamen ein * vorangestellt wird.

Angenommen, ich bin richtig, was mich verwirrt ist, warum ich nicht brauchen, um das für NSInteger zu tun?

72voto

Dan Lorenc Punkte 5340

NSInteger ist ein primitiver Typ, was bedeutet, dass er kann lokal auf dem Stapel gespeichert werden . Sie müssen keinen Zeiger verwenden, um darauf zuzugreifen, aber Sie können es, wenn Sie wollen. Die Zeile:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

gibt eine tatsächliche Variable zurück, nicht ihre Adresse. Um dies zu beheben, müssen Sie die * :

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

Sie können einen Zeiger auf eine NSInteger wenn Sie wirklich eine wollen:

NSInteger *pointerToProcessID = &processID;

Das kaufmännische Und steht für die Adresse des Operators. Es setzt den Zeiger auf den NSInteger gleich der Adresse der Variablen im Speicher und nicht gleich der Ganzzahl in der Variablen.

25voto

Alex Rozanski Punkte 37585

Der Grund dafür, dass Sie keine Angaben machen NSInteger mit einer * ist, weil es kein Objekt ist. Ein NSInteger ist einfach ein int oder eine long :

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif

Wenn sie in einer 32-Bit-Anwendung verwendet wird, ist sie eine 32-Bit-Ganzzahl, und wenn sie in einer 64-Bit-Anwendung erstellt wird, ist sie eine 64-Bit-Ganzzahl.

Natürlich, Sie peut einreichen NSInteger als Zeiger, aber die meisten Funktionen nehmen Argumente einfach als NSInteger und nicht einen Zeiger auf sie.

Objekte hingegen können nur als Zeiger an andere Funktionen übergeben werden. Das liegt daran, dass Objekten dynamisch Speicher zugewiesen wird und sie daher nicht auf dem Stack deklariert werden können. Da ein int ou long einen festen Speicherplatz zugewiesen bekommen hat, ist dies kein Problem.

3voto

Peter Hosey Punkte 94684

El * bedeutet "Zeiger". Die Objektvariable enthält einen Zeiger auf ein Objekt, sie hat also einen * Die NSInteger-Variable enthält einen NSInteger und keinen Zeiger auf einen NSInteger, so dass sie keinen * . Das Einsetzen der * auf diese Variable gibt Ihnen zumindest eine Warnung, weil Sie eine Ganzzahl in eine Zeigervariable setzen.

2voto

Andrei Tanasescu Punkte 638

NSInteger ist nur ein Typedef für int, AFAIK.

0voto

yoAlex5 Punkte 20661

Arbeiten mit Zeigern

NSInteger integer1 = 1;
NSLog(@"1. integer1:%ld &integer1:%p", integer1, &integer1);
//1. integer1:1 &integer1:0x7ffee59e8a98

NSInteger *integer2 = &integer1;
NSLog(@"2. integer2:%p &integer2:%p *integer2:%ld", integer2, &integer2, *integer2);
//2. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:1

*integer2 = 2;
NSLog(@"3. integer2:%p &integer2:%p *integer2:%ld \t integer1:%ld &integer1:%p", integer2, &integer2, *integer2, integer1, &integer1);
//3. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:2    integer1:2 &integer1:0x7ffee59e8a98

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X