2011-01-12 18 views

Antwort

1

Ich glaube, dass die Unterscheidung nur für Zeigertypen wichtig ist; zum Beispiel 'char *'.

const char *p bedeutet, dass der Puffer von p spitz nicht aktualisiert werden, sondern Zeiger p selbst kann (typischerweise inkrementiert mit p ++), beispielsweise geändert werden:

void f(const char *p) 
{ 
    while (*p != '\0') 
    { 
     putc(*p); 
     p++; 
    } 
} 

char * const p bedeutet, dass der Puffer spitz um pkann aktualisiert werden, aber Zeiger kann nicht geändert werden.

EDIT Vielen Dank für JeremyP für den folgenden Kommentar:

Es ist ganz in Apples APIs gemeinsamen String-Konstanten (anstelle der Verwendung #defines), vor allem, wenn die Zeichenfolge ein NSString dh NSString * const kFoo = @"bar";

+0

Wenn Sie einen globalen Const-Zeiger deklarieren, fängt er falsche Versuche ab, diesen zu ändern. –

+0

Einverstanden!Ich habe das aber noch nie gesehen :) – trojanfoe

+0

Es ist ziemlich üblich in Apples APIs, String-Konstanten zu definieren (anstatt #defines zu verwenden), besonders wenn der String ein NSString ist, dh 'NSString * kFoo const = @" bar ";' – JeremyP

2

zu definieren Sie sind gleich.


Ein wenig Hintergrund über const:

Objective-C, wie C, verwendet die Clockwise/Spiral Rule. In einem Fall, wo haben Sie nur Modifikatoren auf der linken Seite der Variablen (von foo) Sie lesen Material von rechts nach links:

int * const * var; 

gelesen wird: var ein Zeiger auf einen konstanten Zeiger ist auf ganzzahlige .

jedoch const hat die gleiche Wirkung, wenn es vor oder nach dem ersten Typ ist:

int const var; // constant integer 
const int var; // constant integer, same as above 

static stattdessen wirkt sich auf die ganze Variable: es ist die Variable statisch zu sein, nicht das Element zeigte durch es oder irgendetwas anderes: ein Zeiger auf eine Ganzzahl kann sowohl zum Zeigen auf eine statische Ganzzahl als auch auf eine automatische Ganzzahl ohne Unterschied verwendet werden, und C bietet keine Syntax zum Deklarieren eines Zeigers, der auf statische Variablen zeigen kann (oder auf automatisch) Variablen).

static int * x; // x is a static pointer to integer 
int static * y; // as above y is a static pointer to integer 
int * static z; // THIS SYNTAX IS NOT ALLOWED 
       // but if it was, it would mean the same thing 

Aus diesem Grund ziehe ich es vor jedem const Modifikator zu platzieren, aber es spielt keine Rolle, eigentlich.

static const int * const * x; // this is what I do 
+0

Das ist eine wunderbare Erklärung von Peoro. Darüber hinaus möchte ich hinzufügen, dass der statische Bereich den Bereich auf den Aufruf (in Objective-C) der Datei begrenzt, in der er aufgerufen wird. Ich würde gerne wissen, was es bedeutet, statisch und konstant miteinander zu kombinieren etwas statisch erklären? Wenn es dir nichts ausmacht, in die Tiefe zu gehen. Ich habe einen guten Referenzlink, der hier mehr erklärt: http://www.numbergrinder.com/2008/12/static-constant-strings-in-objective-c/ – TheCodingArt

Verwandte Themen