Cambiare valore al Puntatore

di il
8 risposte

Cambiare valore al Puntatore

Ciao , un esercizio mi dice di scrivere un codice che cambi il valore al puntatore .
#include <iostream>
int main () {
	int *pi=2;
	std::cout<<*pi ;
	return 0;
}

Ho scritto questo ma crasha .
In teoria il pointer non è un oggetto ? dunque non posso inizializzarlo a un intero ?

8 Risposte

  • Re: Cambiare valore al Puntatore

    Il puntatore lo puoi cambiare facilmente...una volta dichiarato puoi dichiarare un'altra variabile e cambiarlo:

    int *p;
    p=2;
    int y;
    y=*p+n;

    dove n sta per il valore che li vuoi aggiungere (puoi ovviamente fare tutte le funzioni matematiche).
  • Re: Cambiare valore al Puntatore

    Il motivo per cui crasha forse ti è più chiaro se "spezzi" la dichiarazione e inizializzazione su 2 righe:
    
    int *p;
    p = 2;
    
    In pratica crei una variabile di tipo "puntatore ad intero" ed assegni a tale variabile il valore 2. Cioè stai dicendo che gli indirizzi di memoria da 0x2 a 0x5 (ovvero 4 byte) conterranno 32 bit che saranno da interpretare come un numero intero. Questo è estremamente diverso dal dire "creami un puntatore ad una cella di memoria che contiene il numero 2", cosa che avresti dovuto scrivere come:
    
    int *p;
    (*p) = 2;
    
    Di conseguenza se vuoi accedere (leggere o modificare) al valore puntato da un puntatore devi usare l'operatore di dereferenziazione, ovvero l'asterisco.
  • Re: Cambiare valore al Puntatore

    Della ha scritto:


    Il motivo per cui crasha forse ti è più chiaro se "spezzi" la dichiarazione e inizializzazione su 2 righe:
    
    int *p;
    p = 2;
    
    In pratica crei una variabile di tipo "puntatore ad intero" ed assegni a tale variabile il valore 2. Cioè stai dicendo che gli indirizzi di memoria da 0x2 a 0x5 (ovvero 4 byte) conterranno 32 bit che saranno da interpretare come un numero intero. Questo è estremamente diverso dal dire "creami un puntatore ad una cella di memoria che contiene il numero 2", cosa che avresti dovuto scrivere come:
    
    int *p;
    (*p) = 2;
    
    Di conseguenza se vuoi accedere (leggere o modificare) al valore puntato da un puntatore devi usare l'operatore di dereferenziazione, ovvero l'asterisco.
    L'avevo provato , ma crasha lo stesso
  • Re: Cambiare valore al Puntatore

    Scusa ma cosa avevi scritto in quel programma? Magari il problema era altrove!


    Sent from my iPhone using Tapatalk
  • Re: Cambiare valore al Puntatore

    Guarda che non puoi scrivere

    int *p;
    (*p) = 2;

    perché il crash è sicuro dato che il puntatore non è inizializzato.

    E se scrivi

    int *pi=2;
    std::cout<<*pi ;

    il crash lo avrai per la cout perché l'indirizzo 2 non è valido per il tuo processo (ovviamente).

    Se vuoi cambiare il valore di un puntatore, hai 2 strade

    1) cambi il valore di un puntatore con un nuovo valore VALIDO
    2) cambi il valore do un puntatore con un qualsiasi valore che NON utilizzi in seguito
  • Re: Cambiare valore al Puntatore

    Ops giusto, ho scritto proprio una minc*iata bella e buona! Volevo dire questo:
    
    int a = 2;
    int *p;
    p = &a;
    

    Sent from my iPhone using Tapatalk
  • Re: Cambiare valore al Puntatore

    Della ha scritto:


    Ops
    Capita ...
    volevo
    Più semplicemente poteva essere

    int *p =(int *)malloc(sizeof(int));
    (*p) = 2;

    Infine, per rispondere a themagiciant, forse il codice più appropriato per l'esercizion potrebbe essere di questo tipo
    
    	int a=10, b=50;
    	int *p;
    
    	p=&a;
    	cout << *p << endl;
    
    	p=&b;
    	cout << *p << endl;
    
  • Re: Cambiare valore al Puntatore

    Grazie mille , ho riletto bene il "primer" e ho trovato una parte dove dice che non posso assegnare direttamente un literal a un puntatore
Devi accedere o registrarti per scrivere nel forum
8 risposte