(Risolto) [C] Spiegazioe di una dichiarazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
preben
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1188
Iscrizione: giovedì 12 luglio 2007, 20:58

(Risolto) [C] Spiegazioe di una dichiarazione

Messaggio da preben »

Un saluto a tutti!
Vi chiedo una spiegazione su due dichiarazioni che non riesco a capire; il linguaggio è il C
Prima:

Codice: Seleziona tutto

int  *frog[5];
Seconda:

Codice: Seleziona tutto

int (*frog) [5];
Ciao e grazie!
Ultima modifica di preben il venerdì 22 febbraio 2008, 16:10, modificato 1 volta in totale.
Accusare gli altri delle proprie disgrazie è conseguenza della nostra ignoranza!
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: [C] Spiegazioe di una dichiarazione

Messaggio da simo_magic »

sono vettori di puntatori ad intero
Avatar utente
preben
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1188
Iscrizione: giovedì 12 luglio 2007, 20:58

Re: [C] Spiegazioe di una dichiarazione

Messaggio da preben »

Sì, questo lo sospettavo.
Mi sai dire per piacere la differenza tra le due dichiarazioni?
Ciao e grazie!
Accusare gli altri delle proprie disgrazie è conseguenza della nostra ignoranza!
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: [C] Spiegazioe di una dichiarazione

Messaggio da simo_magic »

a*b/c
(a*b)/c

direi che dovrebbe essere un esempio calzante a meno di grossi scivoloni...
Avatar utente
preben
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1188
Iscrizione: giovedì 12 luglio 2007, 20:58

Re: [C] Spiegazioe di una dichiarazione

Messaggio da preben »

Scusa se son duro.
Io ho sempre visto dichiarare i puntatori ad interi in questo modo:

Codice: Seleziona tutto

int *p;
Nelle dichiarazioni che ho postato all'inizio è presente un [5].
Come la posso decifrare la dichiarazione?
Spero di essermi spiegato chiaramente.
Ciao e grazie!
Accusare gli altri delle proprie disgrazie è conseguenza della nostra ignoranza!
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: [C] Spiegazioe di una dichiarazione

Messaggio da simo_magic »

infatti quello è un vettore di variabili, di tipo puntatore ad intero
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [C] Spiegazioe di una dichiarazione

Messaggio da mous16 »

direi che la seconda è proprio un vettore di puntatori a interi.
la prima non saprei dire: leggendola così sputerei un "puntatore a vettore di interi" ma non credo abbia senso (o forse si a ben pensarci)
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: [C] Spiegazioe di una dichiarazione

Messaggio da simo_magic »

mous16 ha scritto: direi che la seconda è proprio un vettore di puntatori a interi.
la prima non saprei dire: leggendola così sputerei un "puntatore a vettore di interi" ma non credo abbia senso (o forse si a ben pensarci)
sono praticamente identiche, l'ho già detto!

la seconda si vede subito che è un vettore di puntatori...

non ha senso un puntatore ad un vettore perchè un vettore è indirizzabile grazie al puntatore al primo elemento, non servirebbe a niente creare un secondo puntatore...
al massimo sarebbe sensato creare un puntatore di puntatore che potrà puntare ad uno qualunque dei puntatori del vettore
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [C] Spiegazioe di una dichiarazione

Messaggio da mous16 »

grazie per la delucidazione (anche se non l'avevo chiesta io)
Comunque è "bello" non sapere queste cose dopo aver passato l'esame di informatica 1 (tutta e solo programmazione in C)
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: [C] Spiegazioe di una dichiarazione

Messaggio da simo_magic »

euhmm mous16 non per mettere il dito nella piaga ma io faccio 4a superiore (rotfl)
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [C] Spiegazioe di una dichiarazione

Messaggio da mous16 »

ecco... ora mi sento davvero sminuito (e siche ho pure preso un ottimo voto in info, e me ne vantavo)!!!
Complimenti, hai davanti un ottimo futuro!
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
VonNeumann
Prode Principiante
Messaggi: 80
Iscrizione: mercoledì 7 giugno 2006, 19:01
Località: Ancona

Re: [C] Spiegazioe di una dichiarazione

Messaggio da VonNeumann »

belin ha scritto: Un saluto a tutti!
Vi chiedo una spiegazione su due dichiarazioni che non riesco a capire; il linguaggio è il C
Prima:

Codice: Seleziona tutto

int  *frog[5];
Seconda:

Codice: Seleziona tutto

int (*frog) [5];
Ciao e grazie!
la prima è un array di 5 puntatori ad interi

la seconda è un puntatore ad un array di 5 interi .. in pratica un puntatore a puntatore ...la dichiarazione è resa Ambigua dalla presenza delle parentesi todne che cambiano la priorità a tutta l'espressione.
Ultima modifica di VonNeumann il giovedì 21 febbraio 2008, 19:02, modificato 1 volta in totale.
«La verità è una cosa troppo complicata perchè permetta qualcosa di differente dalle approssimazioni.»
Avatar utente
VonNeumann
Prode Principiante
Messaggi: 80
Iscrizione: mercoledì 7 giugno 2006, 19:01
Località: Ancona

Re: [C] Spiegazioe di una dichiarazione

Messaggio da VonNeumann »

simo_magic ha scritto:
mous16 ha scritto: direi che la seconda è proprio un vettore di puntatori a interi.
la prima non saprei dire: leggendola così sputerei un "puntatore a vettore di interi" ma non credo abbia senso (o forse si a ben pensarci)
sono praticamente identiche, l'ho già detto!

la seconda si vede subito che è un vettore di puntatori...

non ha senso un puntatore ad un vettore perchè un vettore è indirizzabile grazie al puntatore al primo elemento, non servirebbe a niente creare un secondo puntatore...
al massimo sarebbe sensato creare un puntatore di puntatore che potrà puntare ad uno qualunque dei puntatori del vettore
attenzione!!!  (nono)
un puntatore ad un array è un puntatore a puntatore!!! ha senso e come!!!
il meccanismo del doppio puntatore è proprio quello che consente di realizzare il trasferimento per indirizzo in C che altrimenti non sarebbe possibile!!
«La verità è una cosa troppo complicata perchè permetta qualcosa di differente dalle approssimazioni.»
Ikitt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1816
Iscrizione: mercoledì 24 ottobre 2007, 12:05

Re: [C] Spiegazioe di una dichiarazione

Messaggio da Ikitt »

VonNeumann ha scritto:
belin ha scritto: Un saluto a tutti!
Vi chiedo una spiegazione su due dichiarazioni che non riesco a capire; il linguaggio è il C
Prima:

Codice: Seleziona tutto

int  *frog[5];
Seconda:

Codice: Seleziona tutto

int (*frog) [5];
Ciao e grazie!
la prima è un array di 5 puntatori ad interi

la seconda è un puntatore ad un array di 5 interi .. in pratica un puntatore a puntatore ...la dichiarazione è resa Ambigua dalla presenza delle parentesi todne che cambiano la priorità a tutta l'espressione.
confermo, e conferma anche cdecl:

Codice: Seleziona tutto

$ cdecl explain 'int (*frog)[5]'
declare frog as pointer to array 5 of int
$ cdecl explain 'int *frog[5]'
declare frog as array 5 of pointer to int
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [C] Spiegazioe di una dichiarazione

Messaggio da mous16 »

@Tutti: benchè la discussione mi interessi molto, credo di non essere all'altezza di rispondere... Assumo la parte dell'ascoltatore!
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: [C] Spiegazioe di una dichiarazione

Messaggio da simo_magic »

VonNeumann ha scritto:
simo_magic ha scritto:
mous16 ha scritto: direi che la seconda è proprio un vettore di puntatori a interi.
la prima non saprei dire: leggendola così sputerei un "puntatore a vettore di interi" ma non credo abbia senso (o forse si a ben pensarci)
sono praticamente identiche, l'ho già detto!

la seconda si vede subito che è un vettore di puntatori...

non ha senso un puntatore ad un vettore perchè un vettore è indirizzabile grazie al puntatore al primo elemento, non servirebbe a niente creare un secondo puntatore...
al massimo sarebbe sensato creare un puntatore di puntatore che potrà puntare ad uno qualunque dei puntatori del vettore
attenzione!!!  (nono)
un puntatore ad un array è un puntatore a puntatore!!! ha senso e come!!!
il meccanismo del doppio puntatore è proprio quello che consente di realizzare il trasferimento per indirizzo in C che altrimenti non sarebbe possibile!!
piano e calma

un puntatore ad un intero vettore non esiste e non ha senso. spero che concorderai

intendevo specificare che se esiste un puntatore che punta ad un qualcosa nel vettore allora quel qualcosa dovrà puntare a qualcosa che tutti gli elementi del vettore condividono,cioè il puntatore in testa al vettore

tanto per capirci una idea di questo tipo è sbagliata

a è il puntatore che gestisce il vettore, p quello che punta nel primo caso a tutto il vettore(errato ed impossibile da realizzare), nel secondo caso al puntatore che gestisce il vettore(corretto)
     
a--->|_|_|_|_|_|_|

        {________}
              ^
              |
              p

con la freccia e la graffa(si capisce? brutta ascii art lo so) che punta a TUTTO il vettore non sarebbe tecnicamente corretto


p--->a--->|_|_|_|_|_|_|

con il puntatore p che punta alla testa del vettore si

spero mi sia chiarito ;)
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: [C] Spiegazioe di una dichiarazione

Messaggio da bite »

Codice: Seleziona tutto

#include <stdio.h>
int main ()
{
	int * pippo [5]; /* Array di 5 puntatori a intero */
	int (*pluto) []; /* Puntatore ad un array di interi */
	int paperino [5]; /* Array di interi */
	int numero = 100; /* Intero scalare */
	pippo[3] = &numero; /* Assegno uno dei 5 puntatori dell'array */
	pluto = &paperino; /* Assegno il puntatore all'array */
	paperino[3] = 101; /* Assegno un valore ad un elemento dell'array */
	printf ("%d %d\n", *pippo[3], (*pluto)[3]);
	return 0;
}
Avatar utente
preben
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1188
Iscrizione: giovedì 12 luglio 2007, 20:58

Re: [C] Spiegazioe di una dichiarazione

Messaggio da preben »

Ringrazio tutti per i vari aiuti!
Ora ho le idee un pò più chiare.
Grazie a tutti.
Ciao!
Accusare gli altri delle proprie disgrazie è conseguenza della nostra ignoranza!
Avatar utente
preben
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1188
Iscrizione: giovedì 12 luglio 2007, 20:58

Re: [C] Spiegazioe di una dichiarazione

Messaggio da preben »

A proposito, visto che ci siamo, e visto che siete molto preparati...
...così vi spremo un pò... ;D
Poteste, per piacere, farmi qualche esempio di utilià delle due dichiarazioni?
Ciao e sempre grazie!
Accusare gli altri delle proprie disgrazie è conseguenza della nostra ignoranza!
Avatar utente
VonNeumann
Prode Principiante
Messaggi: 80
Iscrizione: mercoledì 7 giugno 2006, 19:01
Località: Ancona

Re: [C] Spiegazioe di una dichiarazione

Messaggio da VonNeumann »

simo_magic ha scritto:
VonNeumann ha scritto:
simo_magic ha scritto:
mous16 ha scritto: direi che la seconda è proprio un vettore di puntatori a interi.
la prima non saprei dire: leggendola così sputerei un "puntatore a vettore di interi" ma non credo abbia senso (o forse si a ben pensarci)
sono praticamente identiche, l'ho già detto!

la seconda si vede subito che è un vettore di puntatori...

non ha senso un puntatore ad un vettore perchè un vettore è indirizzabile grazie al puntatore al primo elemento, non servirebbe a niente creare un secondo puntatore...
al massimo sarebbe sensato creare un puntatore di puntatore che potrà puntare ad uno qualunque dei puntatori del vettore
attenzione!!!  (nono)
un puntatore ad un array è un puntatore a puntatore!!! ha senso e come!!!
il meccanismo del doppio puntatore è proprio quello che consente di realizzare il trasferimento per indirizzo in C che altrimenti non sarebbe possibile!!
piano e calma

un puntatore ad un intero vettore non esiste e non ha senso. spero che concorderai

intendevo specificare che se esiste un puntatore che punta ad un qualcosa nel vettore allora quel qualcosa dovrà puntare a qualcosa che tutti gli elementi del vettore condividono,cioè il puntatore in testa al vettore

tanto per capirci una idea di questo tipo è sbagliata

a è il puntatore che gestisce il vettore, p quello che punta nel primo caso a tutto il vettore(errato ed impossibile da realizzare), nel secondo caso al puntatore che gestisce il vettore(corretto)
     
a--->|_|_|_|_|_|_|

        {________}
              ^
              |
              p

con la freccia e la graffa(si capisce? brutta ascii art lo so) che punta a TUTTO il vettore non sarebbe tecnicamente corretto


p--->a--->|_|_|_|_|_|_|

con il puntatore p che punta alla testa del vettore si

spero mi sia chiarito ;)
concordo in linea di massima, ma permettimi di dissentire dalla spiegazione!!!
Il nome di un array è in tutto e per tutto un puntatore! tant'è vero che gli array si possono usaer, nel C, con l'aritmetica dei puntatori! int a[10] dichiara un array di 10 interi: a è il puntatore all'array ma con questo non intendo il puntatore all'intero array, bensì il puntatore al primo elemento del blocco di memoria destinato all'array!
in pratica detta in maniera semplice è un puntatore!! poiché un puntatore è una particolare variabile che consente di memorizzare l'indirizzo di un'altra variabile  purché vi sia identità di tipo
ora se io dichiaro un puntatore ad un array, dichiaro una variabile di tipo puntatore, che punta ad un'altra variabile ( nel nostro conterrà l'indirizzo del primo blocco di memoria destinato all'array ) questo è in tutto e per tutto un puntatore a puntatore
Se poi mi vieni a dire che un puntatore ad un array non punta a tutto l'array, bhé questo è ovvio!!
«La verità è una cosa troppo complicata perchè permetta qualcosa di differente dalle approssimazioni.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti