C semplici domande di matrici e puntatori

-2

Quindi ecco la confusione, diciamo che dichiaro un array di caratteri

char name[3] = "Sam";

e quindi dichiaro un altro array ma questa volta usando i puntatori

char * name = "Sam";

Qual è la differenza tra i due? Intendo che funzionano allo stesso modo in un programma. Inoltre, come memorizza la dimensione della roba che qualcuno inserisce in essa, in questo caso 3 caratteri?

Inoltre, in che modo è diverso da

char * name = new char[3];

Se questi tre sono diversi, dove dovrebbero essere usati, intendo in quali circostanze?

    
posta Nash Vail 14.11.2012 - 06:32
fonte

4 risposte

1

La prima opzione consuma solo lo spazio necessario in memoria per una stringa di 3 caratteri + il carattere di terminazione.

EDIT: Grazie per averlo indicato nei commenti. Questa opzione genererà un errore perché hai solo 3 posizioni da riempire, il che significa che non c'è spazio per il carattere di terminazione.

La seconda opzione punta verso la posizione di memoria in cui inizia la nuova stringa. Questo ha una dimensione variabile e deve essere terminato manualmente con un carattere \ 0 (il carattere di terminazione). Questo di solito è preferibile a causa delle sue dimensioni variabili. Ciò significa che consumerà solo la quantità di memoria necessaria, diversamente dalla prima opzione, dove se si memorizza una stringa di lunghezza di 3 caratteri in un array di 100 posizioni, si avranno ancora 100 posizioni riservate in un array.

L'uso della seconda opzione significa che stai usando puntatori invece di matrici, a volte rendendo difficile notare dove si verificano gli errori, quindi un'attenzione particolare quando usi questo.

    
risposta data 14.11.2012 - 06:49
fonte
1
  1. char name[3] = "Sam";
    definisci un array chiamato "nome" (ovviamente puoi usare name[] piuttosto che [3] ) e
    name[0] = 'S', name[1] = 'a', name[2] = 'm', name[3] = 'char * name = "Sam";';
  2. char * name = new char[3];
    definire un puntatore puntato sull'indirizzo in cui "Sam" è (si trova nella posizione di memoria della costante)
  3. %code%
    definisci un puntatore del puntatore all'indirizzo che si trova nell'archivio o nell'heap gratuito, dove verranno salvati 3 caratteri.
risposta data 14.11.2012 - 08:08
fonte
0

Nella tua prima variante hai una matrice di tre caratteri in una variabile chiamata name e puoi memorizzare al massimo 3 caratteri.

Nella tua seconda variante, hai dichiarato un puntatore di caratteri che punta a una sequenza di tre caratteri, ad esempio "sam".

La principale differenza è che non puoi cambiare il valore del primo puntatore name (posizione a cui punta), usando operatori come ++ , -- , + e - .

Ma nella seconda opzione puoi cambiare la posizione a cui punta e puoi assegnarlo a qualcosa con più lunghezza più avanti nel programma come:

char * name= "sam";
/*some code goes here*/
name="hello";

In altre parole, name è costante nella prima variante.

Nell'ultima variante stai solo assegnando uno spazio di tre caratteri e assegnando l'indirizzo base al puntatore name .

    
risposta data 14.11.2012 - 07:50
fonte
0

Oltre a ciò che altri hanno spiegato, vorrei illustrare il primo esempio un po 'più in dettaglio. Come ha sottolineato Mohit Sehgal, in C la dichiarazione

char name[3] = "Sam";

assegna solo tre byte per la variabile name e non mette 0 terminatore di stringa: name[0] == 'S' , name[1] == 'a' , name[2] == 'm' , name[3] == qualunque cosa sia contenuta nell'indirizzo successivo dopo l'ultimo (terzo) byte di name . Ad esempio, prova il seguente programma:

#include <stdio.h>

char s[3] = "abc";
char t[]  = "def";

int main(int argc, char *argv[])
{
  printf("s = '%s'\n", s);
  printf("t = '%s'\n", t);
}

Il risultato sarà:

s = 'abcdef'
t = 'def'

perché t è stato assegnato subito dopo s e s ora punta a una stringa che va avanti fino a quando viene trovato il terminatore 0 di t .

Se si dichiara un array con inizializzazione ma senza dimensione, verrà allocato spazio sufficiente per tutti i dati nell'elenco di inizializzazione. Pertanto

#include <stdio.h>

char s[] = "abc";
char t[] = "def";

int main(int argc, char *argv[])
{
  printf("s = '%s'\n", s);
  printf("t = '%s'\n", t);
}

stamperà

s = 'abc'
t = 'def'

Ho testato le stesse dichiarazioni in C++ (usando il compilatore GNU), e

char name[3] = "Sam";

fornisce un errore del compilatore perché l'inizializzatore di stringhe (che C ++ considera di lunghezza 4, incluso il trailing 0) è troppo lungo per la variabile.

Quindi, sia in C che in C ++, il compilatore non assegnerà più byte di quelli specificati nella dichiarazione.

    
risposta data 14.11.2012 - 14:55
fonte

Leggi altre domande sui tag