Newsgroup: it.comp.lang.c
Titolo: Stringa e array[]

Ciao a tutti
Vorrei sapere una cosa (sono un po confuso). Una stringa č un char *. La
prima domanda č.... perchč? la seconda domanda č : per iniziallizzare una
array con una stringa basta fare char string[] = "ciao";
perchč non si fa char *string[]="ciao"; ????
e poi cosa significa dichiarare un puntatore char ad un array?
Grazie in anticipo per le risposte... :-)

 e poi cosa significa dichiarare un puntatore char ad un array?
Eh? Intendi dire  perche` il  nome dell'array decade  a puntatore? Direi
per non introdurre asimmetrie nell'artimentica dei puntatori.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La mia teoria scientifica preferita e` quella secondo la quale gli 
 anelli di Saturno sarebbero interamente composti dai bagagli andati 
 persi nei viaggi aerei." -- Mark Russel

e poi cosa significa dichiarare un puntatore char ad un array?
Non significa nulla.
L'espressione "puntatore char ad un array" non vuol dire nulla in C.
-- 
Andrea Laforgia
"Meglio cieco che negro" (Stevie Wonder).

 primo elemento.
Non lo capisco! Potresti riformulare la frase?
Tommy

 Non lo capisco! Potresti riformulare la frase?
E' solo polemica, o vuoi veramente una spiegazione?
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 E' solo polemica, o vuoi veramente una spiegazione?
Sei prevenuto?!? No, non capisco cosa intenda...
(probabilmente e' banale, ma non capisco, nonostante credo di capire cosa
succeda...e cosa significhi).
Tommy

[...]vuoi veramente una spiegazione?
Non leggo i messaggi del tale "Tommy" (e` nel kill-file), ma una
spiegazione non gliela darei comunque ;-)
-- 
Andrea Laforgia
#exclude <windows.h>

 E' solo polemica, o vuoi veramente una spiegazione?
Secondo me la frase e' un po' oscura detta cosi', ti lascia immaginare che 
ci sia qualcos'altro di arcano e misterioso dietro, mentre e' solo una 
puntualizzazione usate per rafforzare il concetto.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

puntualizzazione usate per rafforzare il concetto.
Se la frase a cui ti riferisci e` la mia, non ci trovo assolutamente
nulla di arcano, ne` di misterioso, dietro.
Nella dichiarazione:
char s[] = "andrea";
Il secondo elemento e` un array di 7 elementi, che NON decade in
puntatore al primo elemento.
I casi in cui un puntatore non decade nel puntatore al suo primo
elemento, sono quelli in cui scrivo (prendendo ad esempio la notazione
usata da me):
&s oppure sizeof(s) oppure, appunto, l'inizializzazione di cui sopra,
in quanto la dichiarazione equivale a:
char s[] = {'a','n','d','r','e','a','\0'};


 nulla di arcano, ne` di misterioso, dietro.
E' solo una questione di interpretazione, e quella che do qui e' la mia (che 
quindi puo' benissimo essere non-condivisa da altri). 
Secondo me quando la leggi la prima volta sembra che tratti il caso:
char s[] = "paolo"  /* cambiamo un po' il nome :P */
come un caso a parte, diverso dai precendenti (anche il punto che metti e 
l'iniziare la frase successiva con la maiuscola aiuta a pensare questo).
Quando leggi (dopo l'elenco dei 3 casi) questa frase: "Il secondo elemento 
e` un array di 7 elementi, che NON decade in puntatore al primo elemento."
Ti chiedi di cosa stai parlando e perche' l'hai puntualizzato (pare ovvio, 
quindi una puntualizzazione su una cosa ovvia ti fa pensare che ci sia un 
eccezione e che ti sia sfuggita).
Io mi sarei semplicemente limitato ad elencarli (era gia' abbastanza chiaro) 
oppure a indicare tra parentesi o con una nota che ti stai riferento 
all'array "paolo", non a /s/ :)


 e poi cosa significa dichiarare un puntatore char ad un array?
Assolutamente nulla. Mi sembra una frase con ordinamento random delle 
parole.

Io mi sarei semplicemente limitato ad elencarli (era gia' abbastanza chiaro) 
Io ho elencato i tre casi, proprio perche` non mi sembrava che fosse
"abbastanza chiaro".  
Per cortesia, evitiamo di discutere di queste stupidaggini.


 succeda...e cosa significhi).
Provo a spigare:
char* strPtrP = "stringa";
e
char strArr[] = "stringa";
hanno due comportamenti diversi.
Nel primo caso viene allocato lo spazio per una stringa da qualche parte
e l'indirizzo di stringa viene assegnato a strPtrP. Nel secondo caso viene
allocato spazio per un array lungo abbastanza da contenere "stringa"
(compreso il terminatore) e "stringa" viene copiato dentro l'array (viene
usato per inizializzare l'array).
Questo comporta che nel secondo caso e' lecito modificare il contenuto
dell'array, invece la modifica di quanto indirizzato da strPtrP e' un
"undefined behaviour" (gcc di default non consente la modifica di
"stringa", VC++ si).
C'e' da notare anche che strArr contiene 's','t','r','i','n','g','a','\0'
solo se la sua lunghezza non e' specificata o se
sizeof(strArr) > strlen("stringa"), in caso contrario la stringa usata per
inizializzare l'array viene troncata alla dimensione dell'array
Se si inizializza
char strArr[4] = "stringa"; [1]
si ottiene
's','t','r','i'
se si inizializza
char strArr[strlen("stringa")] = "stringa"; [2]
's','t','r','i','n','g','a'
Notare l'assenza del terminatore e il fatto che
char strArr[strlen("stringa")]
e' sbagliato :-)
HTH
C:\>iao Angelo
[1] In C++ un'istruzione del genere da' errore in fase di compilazione.


>rimo elemento.
Il secondo elemento di cosa? Dell'array? All'interno delle virgolette?
Oppure intendeva s[] che partendo da sinitra e' il secondo?
Per questo ho scritto: "Non lo capisco! Potresti riformulare la frase?"
La trovavo ambigua. Ora grazie alla discussione con Mox e la tua spiegazione
ho finalmente capito cosa intendeva:
La lista di inizializzatori alla destra dell'operatore di assegnamento non
decade in puntatore al primo elemento. In questo caso si e' usata una
stringa costante che non e' altro che una forma abbreviata della seguente:
{'a','n','d','r','e','a','\0'}.
L'ultima parte era facoltativa. Quello che non capivo era l'uso delle
parole:
- secondo elemento ("elemento" quando si parla di array confonde!)
- array (beh, non propriamente!)
Tommy

>Gia` fatto, torniamo a parlare *seriamente* di C ;-)
dopo che io avevo scritto:
"Avevo capito, e probabilmente aveva capito anche BottleMan, ma meglio aver
tirato fuori l'errore di typing per evitare problemi, non trovi?"
Per far notare che il mio intervento non voleva togliere nulla al programma
di Andrea e stressare il fatto che fosse solo un errore di typing.....
errore che comunque e' tale e bisognerebbe correggere.
Mi dispiace che se sbaglia uno nuovo correggerlo sia normale, se sbaglia uno
che frequenta da qualche anno, correggerlo sia offensivo! Questa e' la
vostra visione e NON la mia.
Tommy
P.S. La mia intenzione non e' far partire un altro flame, solo faccio fatica
a sopportare questo comportamento ostile nei miei confronti. (spero non
parta un altro flame, da parte mia, mi sentivo solo in dovere di precisare,
visto che mi attaccate ingiustamente).

 >>rimo elemento(DI CHE COSA?).
La teoria dietro penso (e spero) di saperla, non capisco solo a cosa si
riferisca Andrea!
Tommy
P.S. spero di averci preso questa volta, ad ogni modo non importa. Sono
nella lista di persone cattive da ignorare (non credo al kill-file), e
quindi il caro Andrea puo' andare avanti a fare i suoi mologhi poco
chiari....

 Cosa c'e' stato di sbagliato a fare notare un incremento sbagliato?!?
Il tono del post?
C:\>iao Angelo


 entrato nel thread) mi e' sembrato un tantinello polemico:
.. e continua a sembrarmi un tantinello polemico.
Forse la frase di Andrea non era il massimo della chiarezza. Ma
"Non lo capisco! Potresti riformulare la frase?"
piu' che una richiesta di spiegazioni da' l'impressione di "ho voglia di
lite".


 Per cortesia, evitiamo di discutere di queste stupidaggini.
Era solo un mio commento sulla lettura del tuo post, per altro corretto come 
contenuti: secondo me se lo leggeti la prima volta senza sapere di cosa si 
parlava ti lasciava un po' confuso.
Comunque i contenuti sono esatti e questa discussione e' finita palesemente 
OT, quindi la smetto di pormi queste seghe mentali (che sono gia' 
abbastanza indietro con le altre cose che devo fare :P).
Bye :)
