2013-04-10 9 views
9

Come ho capito, secondo MSDN C# dichiarazione fisso dovrebbe funzionare come:Unsafe puntatore stringa dell'istruzione

fixed (char* p = str) ... // equivalent to p = &str[0] 

così, perché posso `t fare questo?

const string str = "1234"; 
    fixed (char* c = &str[0]) 
    { 
/// ..... 
    } 

Come posso ottenere puntatore str[1], per un esempio?

+0

Che errore si ottiene? –

+0

errore in fase di compilazione: impossibile prendere l'indirizzo dell'espressione data –

+0

possibile duplicato di [Impossibile prendere l'indirizzo dell'espressione data \t C# pointer] (http://stackoverflow.com/questions/5079736/cannot-take-the- address-of-the-given-expressionc-pointer) –

risposta

4

Questo perché l'operatore [] sulla stringa è un metodo che restituisce un valore. Il valore restituito da un metodo quando è un tipo di valore primitivo non ha un indirizzo.

[] operatore in C# non è lo stesso di [] in C. In C, gli array e stringhe di caratteri sono solo puntatori, e l'applicazione di [] operatore in un puntatore, è equivalente a spostare il puntatore e dereferenziazione esso. Questo non vale in C#.

In realtà c'è stato un errore nella documentazione MSDN si è collegato, che è stato risolto di latest version.

Vedere here maggiori spiegazioni su questo argomento esatto.

+0

"I valori restituiti dai metodi non hanno un indirizzo." non è del tutto vero - è appena successo che il ritorno di 'string [int]' è 'char' che non è un tipo che può essere" risolto ". –

1

Il punto dell'istruzione fixed impedisce l'allocazione della memoria dalla memoria virtuale. L'allocazione della memoria è identificata dal suo inizio, non da nessun altro indirizzo.

Quindi, per mantenere fisso &str[1], è necessario l'intero str corretto; puoi quindi utilizzare l'aritmetica del puntatore per ricavare altri puntatori all'interno della singola allocazione dal puntatore fisso a str come desideri.

0

modificare il codice a questo:

char[] strC = "1234".ToArray(); 
fixed (char* c = &strC[0]) 
{ 
    /// ..... 
} 
+0

Fornisce un indirizzo che punta a una posizione di memoria che contiene il primo carattere, ma non può essere utilizzato per accedere ad altri caratteri della stringa. –

7

Dal momento ottenere un puntatore ad un elemento in seguito direttamente funziona con gli array, ma non con le stringhe sembra che l'unica ragione è che la SM non attuarlo. Sarebbe stato facilmente possibile progettarlo in questo modo, seguendo la semantica degli array.

Ma è possibile calcolare facilmente un altro puntatore che punta su altri elementi di matrice. Quindi non è un grosso problema nella pratica:

fixed (char* p = str) 
{ 
    char* p1 = p+1; 
} 
Problemi correlati