2010-10-06 4 views
8

Voglio passare un puntatore a una funzione. Voglio che questo puntatore indichi un punto nel mezzo di un array. Supponiamo che io abbia un array come tale unsigned char BufferData[5000];, la seguente frase dovrebbe essere sintatticamente corretta?Qual è il modo corretto di sfalsare un puntatore?

writeSECTOR(destAddress, (char *)(BufferData + (int)(i * 512))); 
// destAddress is of type unsigned long 
// writeSECTOR prototype: int writeSECTOR (unsigned long a, char * p); 
// i is an int 
+1

Sì. Il cast di 'int' non è necessario, ma in caso contrario la tua affermazione è valida. –

+2

In effetti, direi che la tua soluzione è migliore di molte delle risposte proposte qui sotto! –

+0

Preferisco l'approccio & array [i] in quanto è più ovvio che stai sfalsando un puntatore in un array, cioè BufferData + (i * 512) è meno leggibile rispetto alle sue intenzioni rispetto a BufferData [i * 512]. – Cthutu

risposta

16

che avrebbe fatto, ma basta farlo:

writeSECTOR(destAddress, &BufferData[i * 512]); 

(che suona come writeSECTOR davvero dovrebbe prendere un unsigned char * però)

3

che dovrebbe funzionare. In C, l'aggiunta di un intero a un puntatore aumenta il puntatore del numero intero moltiplicato per il sizeof del tipo a cui punta il puntatore.

6

Si può semplicemente fare BufferData + i * 512. Un operatore aritmetico + su char * produce un char * quando si aggiunge un valore intero ad esso.

0

sembra ok, ma provate sul compilatore,

È possibile utilizzare writeSECTOR (DestAddress, & BufferData [i * 512]);

0

Sembra che passerà all'indirizzo dell'elemento i * 512th dell'array. E 'quello che vuoi che faccia?

Non vedo davvero quale sia il cast di int che ti sta comprando.

5

L'aritmetica del puntatore è abbastanza semplice da comprendere. Se hai un puntatore al primo elemento di un array, p + 1 punta al secondo elemento e così via indipendentemente dalla dimensione di ogni elemento. Quindi, anche se tu avessi una serie di interi, o una struttura arbitraria MyData, sarebbe vera.

MyData data[100]; 
MyData *p1 = data;; // same as &data[0] 
MyData *p2 = p1 + 1; // same as &data[1] 
MyData *p3 = p2 + 1; // same as &data[2] 
MyData *p4 = p2 - 1; // same as &data[1] again 

Se l'array è unsigned char allora basta aggiungere comunque molti byte di offset si desidera andare nella matrice, per esempio

unsigned char data[16384]; 
unsigned char *offset = data + 512; // same as &data[512] 
*offset = 5; // same as data[512] = 5; 

In alternativa, se la notazione è confusa, si può sempre fare riferimento ad esso come indicato nei commenti di cui sopra, ad esempio, &data[512]

+0

p4 non è "// uguale a & data [1] di nuovo". p4 è uguale a & data [0]. – Fox

0

Questo dovrebbe funzionare come credi. Il puntatore in C è solo un indirizzo nella RAM, quindi è possibile deviare il puntatore nella misura.