Newsgroup: it.comp.lang.c
Titolo: Puntatore - facile credo

q                                     *q
o------------------------>| FLOAT |
Sia *q un ptra a un float (è giusta la rappresentazione? &*q = q?). Ha
qualche senso l'espressione 2**q? Va percaso intesa come 2 per *q? Quali
operazioni sono lecite sui ptr?


/usr/nicola cat p.c
#include <stdio.h>
 
int main(int argc, char **argv) {
  int *i, I=5;
  i = &I;
  printf ("i=%x &*i=%x 2**i=%d\n",
          i, &*i, 2**i);
}
/usr/nicola cc -o p p.c
/usr/nicola p
i=8047790 &*i=8047790 2**i=10

operazioni sono lecite sui ptr?
Somma di un ptr con un integer, sottrazione di un ptr con un integer,
differenza di puntatori (forse con qualche limitazione).
E' illegale la somma di puntatori.
Lanugo

Ok amici, vi ringrazio!
Non sapevo che fosse illegale la somma di ptr ;-)
Grazie
"Alessandro "oVeRRiDe"" <oVeRRiDe@i.i> ha scritto nel messaggio
news:kG4_5.102115$hk4.3...@news.infostrada.it...


Non sapevo che fosse illegale la somma di ptr ;-)
Difatti non ha granche' senso.
E' come se volessi sommare due date.
Di certo il 01/01/1980 e il 20/12/1990 non fanno il 21/13/3970 :)
--
Andrea Laforgia (ICQ 87230455)
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 Di certo il 01/01/1980 e il 20/12/1990 non fanno il 21/13/3970 :)
Beh, effettivamente in un programma *normale* non ha un gran chè senso.
Ma se ad esempio in un kernel hai l'indirizzo ad un area di memoria
relativa di un programma, e l'indirizzo dell'area di memoria assoluta
di quel programma, sommando questi puntatori hai l'indirizzo assoluto
di quella data area di memoria. Questo mi sembra l'unico caso nel
quale la somma di puntatori ha senso.
(Qualcuno mi corregga se dico cazzate!)
Nicola.

 Beh, effettivamente in un programma *normale* non ha un gran chč senso.


quale la somma di puntatori ha senso.
Attenzione, in questo caso non si parla di somma tra puntatori (che
non ha comunque senso), ma di somma di un puntatore con uno scalare.
Cioe', si sta dicendo al sistema che la mia variabile risiede nella
posizione uguale alla somma dell'indirizzo assoluto piu' un certo
numero di byte. Non si parla di indirizzo all'area di memoria
relativa, ma di offset in byte. E' molto diverso.
Ribadisco : la somma tra puntatori non e' valida.
int main()
{
    char *p1 = "pippo" ;
    char *p2 = "pluto" ;
    char *p3 = p1 + p2 ; 
    // [C++ Error] Unit1.c(5): E2085 Invalid pointer addition 
    return 0;


Eppure il compilatore accetta tutto, somme, prodotti ecc...
Assolutamente no, e' errato a livello logico che accetti prodotti e
divisioni tra puntatori e scalari, mentre non e' errato che accetti
somme con scalari, cosi' come e' corretto che accetti sottrazioni con
scalari (in quest'ultimo caso solo quando lo scalare viene sottratto).
int main()
{
    char *p1 = "pippo" ;
    char *p2 = "pluto" ;
    char *p3 = 2*p1 ;
    // [C++ Builder 5.0]
    // [C++ Error] Unit1.c(5): E2087 Illegal use of pointer
    return 0;


 Ribadisco : la somma tra puntatori non e' valida.
C'ha ragione, sà?
Non credevo, ma testardamente ho provato!
Grasie,
Nicola.

 ha scritto nel messaggio
news:dh7k3t40tbt5g27ao...@4ax.com...


Bhe ma sono bastardi sti puntatori, mi fanno fare una confusione!
Non tanto. 
Il tutto rientra in una logica dalla semplicita' disarmante.


 ha scritto nel messaggio
news:3odn3t0pbd7590dv6...@4ax.com...


assegnare un int o un long a un puntatore?
Tecnicamente sarebbe possibile assegnare un valore intero/long ad un
puntatore a qualunque cosa, ed al contrario prendere il valore contenuto in
un puntatore (non il valore a cui punta, bada bene) ed assegnarlo ad un int
o ad un long. Dovrebbe (dico dovrebbe perché non ho mai fatto la prova)
bastare l'uso di un cast ed il compilatore smette di lamentarsi.
Il problema è: ha senso farlo?
Ora, io non è molto che programmo, ma in tutto quello che ho scritto sotto
linux e sotto dos/windows non ho mai avuto bisogno di assegnare il valore di
un intero ad un puntatore, o viceversa. Semmai c'è bisogno dell'operatore &,
che anteposto ad un nome di variabile, restituisce un puntatore a quella
variabile, ad es:
int x = 15;
int *p;
p = &x; // p punta ad x
Lanugo

 ha scritto nel messaggio
news:3odn3t0pbd7590dv6...@4ax.com...


 variabile, ad es:
Questo potrebbe essere uno dei casi in cui tale pratica puo' risultare utile:
#include<stdio.h>
  typedef struct elem{
    char *stringa;
    long number;
  } st_dati;
void esegui(int(*fun[])(void*),void** arg)
{
 fun[0](arg[0]);
 fun[1](arg[1]);
}
int stampa_int(void* arg)
{
  fprintf(stderr,"Il valore di stampa_int e':%d\n",(int)arg); // non portabile
  return 0;
}
int stampa_dati(void* arg)
{
  fprintf(stderr,"Il valore di stampa_dati e':%s---%ld\n",
((st_dati*)arg)->stringa,
((st_dati*)arg)->number);
  return 0;
}
int main()
{
  int arg_int=3;
  st_dati arg_dati={ "Ivan",1000L };
  int(*fun[])(void*) = { stampa_int,stampa_dati };
  void* arg[] = { (void*)arg_int,(void*)&arg_dati }; // non portabile
  esegui(fun,arg);
  return 0;
}
Ovviamente  la possibilita' di poter eseguire  codice  di questo genere senza
intoppi e' altamente platform-dependent,quindi non portabile.
--
Ivan Molella
__LINUX__ the choice of the __GNU__ generation
icq# 97960484

5. Differenza tra puntatori (a che serve? Perchè invece non vale la somma?)
char *p = "andrea" ;
char *p1 = &p[0] ;
char *p2 = &p[3] ;
// caratteri presenti dalla posizione p1 a p2
int n = p2 - p1 + 1 ;


 5. Differenza tra puntatori (a che serve? Perchè invece non vale la somma?)
Serve a conoscere il numero di elementi compresi tra i due puntatori.
EMG