|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
[C] Passare 1 filepointer x riferimento e NON valore ad 1 funzione è possibile?!
... come da titolo.
![]()
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
void func (FILE **pf) { fprintf (*pf, "Ciao"); } int main (void) { FILE *f; .... func (&f); .... }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jan 2006
Città: Prov.Cagliari
Messaggi: 1583
|
Quote:
![]() ![]() ![]() ![]() ![]()
__________________
MB: ASUS Prime x570-P - CPU: AMD Ryzen 9 3900x with Arctic Liquid Freezer II 240 - Memorie: G.Skill Ripjaws DDR4 2x16GB 3200 - HDs: Samsung 970 EVO plus and Crucial P2 1TB - Ali: Seasonic Focus GX-650 - Video: AMD Asus GTX770 Direct CU II - Concluso Positivamente con : M@x27, mirco2034, max x2, relativo, Mighty Max e tanti altri |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Il C++ consente in più anche il passaggio tramite "reference". Notare che reference si traduce appunto in "riferimento" ma non ci si deve confondere. Il passaggio tramite "reference" in C++ è praticamente un passaggio per indirizzo nascosto al programmatore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
|
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
diciamo che passando per valore l'indirizzo di una variabile, ottieni come side-effect il passaggio per riferimento.
__________________
Ciao ~ZeRO sTrEsS~ |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Direi di no. Altro è come passi le variabili, altro è quello che puoi fare con quelle variabili una volta che siano state passate.
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
Per una volta che c'è una regola sola, dobbiamo complicarci la vita inventandocene un'altra? Ecchesiamo, masochisti? ![]() |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
anche a noi all'uni ci hanno fatto la distinzione tra passaggio per indirizzo e per riferimento.
avendo fatto informatica e sistemi al liceo la cosa mi sembrava troppo astratta e "campata per aria" ed ho chiesto dettagli su ciò che fisicamente avveniva in memoria alla fine della lezione... il prof mi ha confermato che il passaggio per riferimento è solo un passaggio per indirizzo fatto dal compilatore (un po' più comodo, nel senso che non occorre usare l'operatore di indirezione ogni volta che si vuole usare l'oggetto passato per indirizzo) Ultima modifica di Furla : 02-12-2006 alle 21:17. |
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Se poi si riferiscono al fatto che non c'è la "pappa pronta" beh allora si. CMQ il master of C ![]() Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 02-12-2006 alle 23:35. |
||
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
![]() |
![]() |
![]() |
#13 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quando i dati vengono passati ad una funzione, vengono "pushati" sullo stack, quindi è normale che qualunque cosa passi fisicamente, è comunque una copia. Quote:
Ad una funzione puoi passare: - tipi fondamentali: per valore o per indirizzo - strutture/union: per valore o per indirizzo - array: solo per indirizzo - puntatori a funzioni: solo per indirizzo, ovviamente Quindi ci sono 2 modi passaggio. Punto. Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Insisto sul fatto che ha ragione Antonio23. In C c'è solo il passaggio per valore (più esplicitamente detto per copia). In C++ c'è il passaggio per copia o per riferimento.
Passaggio per riferimento non significa che posso prendere una variabile e usare come argomento di una funzione un puntatore a quella variabile: significa che prendo quella variabile, passo quella variabile e la funziona lavora su un riferimento a quella variabile. Che per lavorare su un riferimento alla variabile usi un puntatore, un reference o delle ali di pipistrello non è pertinente al contesto del passaggio per copia o per riferimento di valori ad una funzione. Altrimenti detto, mentre in C, data la variabile: int x = 10; l'unica funzione che può operare su x (non su un puntatore ad x nè sull'indirizzo di x) è: fun(int x) a cui x arriva nell'unica forma possibile in C, cioè per copia, in C++ data la stessa variabile: int x = 10; esistono due funzioni compatibili con x: funByValue(int x) e funByRef(int& x) la prima che opera su una copia di x e la seconda su un riferimento ad x. La stessa variabile x, non un puntatore a x nè l'indirizzo di x, è passabile ad entrambe le funzioni, nel primo caso per copia nel secondo per riferimento. Dietro le quinte è usato l'indirizzo della variabile? E' una leggittima curiosità e una possibile implementazione. Potrebbe anche pigliare tutta la funzione e copiarla in-line, funzionerebbe lo stesso. Ma non è questo che conta ai fini dell'esistenza del passaggio per riferimento o per valore o per entrambi. Naturalmente se ho detto stupidaggini sentitevi esortati a segnalarmele. |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Qui si vede tutta la rigidità del ingegnere.
![]() CMQ è 1 po' come dire che il lavoro lo faccio usando la materia trasformata in energia. Ciò nonostante materia ed energia rimangono 2 cose differenti. ... e poi vi sfido a passare 1 array x valore. ![]() IMHO ha ragione ANDBIN che è già intervenuto fin troppo x spiegarlo ed ha fatto 1 buon lavoro. Voi invece sempre IMHO non state guardando alla pragmaticità del discorso, ma solo alla soluzione implementativa di come le cose avvengono. Aveva detto bene anche: Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 05-12-2006 alle 11:27. |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
In fin dei conti è quasi la stessa cosa, IMHO:
Codice:
#include <stdio.h> int F1(int x) { x = 5; } int F2(int *x) { *x = 5; } int main() { int v = 3; F1(v); printf("Valore: %d.\n", v); F2(&v); printf("Valore: %d.\n", v); return 0; } ![]() Stiamo lì in quanto a risultati. ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 05-12-2006 alle 15:07. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Non c'entra la rigidità dell'ingegnere, questa è informatica.
Quando usi l'operatore & non fai altro che ricavare l'indirizzo di una variabile, che sarà passato per valore alla funzione - che guarda caso accetta un puntatore... Questo non è passaggio per riferimento. Se lo volete chiamare per riferimento fate pure, la letteratura informatica dice tutt'altro. Vedi anche wikipedia: http://it.wikipedia.org/wiki/Funzion...er_riferimento
__________________
|Java Base| |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
![]() CMQ l'unico che mi ha aiutato realmente è solo 1, grazie.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Codice:
void f(int* x) { printf("%d",*x); *x=3; printf("%d",*x); } int main { int x=5; int *px=&x; f(&x); f(px); } |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:01.