2015-02-21 12 views
5

Ho lo snippet di codice seguente per comprendere il funzionamento del puntatore sull'array di caratteri di lunghezza specifica, con il seguente codice di esempio.Come si comporta il puntatore alla matrice di caratteri?

#include <stdio.h> 
int main(){ 

    char sports[5][15] = { 

      "cricket", 
      "football", 
      "hockey", 
      "basketball" 
    }; 

    char (*sptr)[15] = sports; 

    if (sptr+1 == sptr[1]){ 

     printf("oh no! what is this"); 
    } 

    return 0; 
} 

Come sptr+1 e sptr[1] possono essere uguali? Come il primo significa incrementare l'indirizzo, che è memorizzato in sptr per uno e il secondo uno dei mezzi per ottenere il valore all'indirizzo memorizzato in sptr + 1.

+0

Non riesco a ottenere GCC (né Clang) per non avvisare sulla mancata corrispondenza del tipo (un compilatore conforme a qualsiasi standard C deve avvisare e anche 'gcc -traditional' fa). Quale compilatore hai usato? – mafso

+0

@mafso sto usando i blocchi di codice – YakRangi

+0

Questo è un IDE, non un compilatore. Gcc, Clang, MSVC sono compilatori, per esempio. – mafso

risposta

7

sptr è un puntatore a vettore di 15char s. Dopo averlo inizializzato con sports, sptr punta al primo elemento dell'array sports che è "cricket".

sptr + 1 è puntatore al secondo elemento di sports che è "football" e sptr[1] è equivalente a *(sptr + 1) che è puntatore al primo elemento di "football", cioè,

sptr + 1 ==> &sports[1] 
sptr[1] ==> &sports[1][0] 

Da pointer to an array and pointer to its first element are both equal in value, sptr+1 == sptr[1]true valore.

Si noti che sebbene lo sptr+1 e lo sptr[1] abbiano lo stesso valore di indirizzo, i loro tipi sono diversi. sptr+1 è di tipo char (*)[15] e sptr[1] è di tipo char *.

+0

ma come * (sptr + 1) è un puntatore dovrebbe essere il valore del secondo elemento della stringa di calcio che è f? – YakRangi

+0

È spiegato in dettaglio nella risposta collegata con questa risposta. Leggi questa risposta e se trovi qualche difficoltà, allora sono qui. – haccks

+0

grazie amico per il tuo supporto per dire che sono qui, grazie uomo – YakRangi

1

Mentre dereferenziazione il compilatore puntatore farà in questo modo,

a[i] == *(a+i); 

È possibile verificare che utilizzando l'istruzione printf.

printf("%p\n",sptr[1]); 
printf("%p\n",sptr+1); 

segnalare questo link.

+0

sì uomo guarda che è la mia domanda sptr [1] significa * (sptr + 1) quindi come è uguale a (sptr + 1)? – YakRangi

+0

no man non c'è niente lì nei blocchi di codice – YakRangi

+1

Bene hai modificato la tua domanda ma sembra che tu sia confuso con quel confronto. Il confronto sopra non è uguale a ''c' == 'c''. Questo è un confronto tra puntatori. – haccks

Problemi correlati