Puntatori C

di il
10 risposte

Puntatori C

Ciao a tutti ho appena iniziato a studiare i puntatori.
Non riesco a capire i puntatori costanti a dati costanti e ho provato a stampare un array, tramite questi puntatori costanti a dati costanti ma mi esce un errore di segmentazione.
#include <stdio.h>
#include <stdlib.h>
#define EXIT_SUCCESS

void printGrade(const int * const gradesPtr);

int main(void)
{
	const int grades[5] = {0,20,5,6,23};
	size_t x;

	for(x = 0;x < 5;x++)
	{
		printGrade(grades[x]);
	}

	return EXIT_SUCCESS;
	
}

void printGrade(const int * const gradesPtr)
{
	printf("%d\n",*gradesPtr);
}
Sapreste aiutarmi a capire i puntatori?

10 Risposte

  • Re: Puntatori C

    Grades[x] non è un puntatore ma è un intero... Se vuoi il puntatore ad un determinato elemento devi scrivere &grades[x].
    Fermo restando che l'esempio che riporti serve solo a complicarti la vita in quanto bastava scrivere una funzione come
    void printGrade(int grade)
    {
       printf("%d\n",grade);
    }
    senza l'uso di inutili puntatori
  • Re: Puntatori C

    Grazie mille
    Lo so che era piú semplice non utilizzare i puntatori ma era un esempio per capire il privilegio minimo.
    Sapresti dirmi anche quando é conveniente utilizzare i puntatori?
  • Re: Puntatori C

    Lo so che era piú semplice non utilizzare i puntatori ma era un esempio per capire il privilegio minimo.
    Sapresti dirmi anche quando é conveniente utilizzare i puntatori?
    Permettimi di consigliarti di lasciar stare i puntatori costanti o non costanti a dati costanti o non costanti: devi prima capire bene cosa sono e a cosa servono i puntatori.
    In C tipicamente i puntatori sono utilizzati per:
    - passare un argomento di funzione per riferimento (es. prova a scrivere una funzione che scambia (swappa) fra di loro due interi...);
    - lavorare con gli array (es. nel tuo caso scrivi una funzione che ricevuti in input l'array e la dimensione dell'array ne stampa tutti gli elementi)
    - ... e tante altre situazioni
  • Re: Puntatori C

    Il princio del privilegio minimo in ingegneria del software, indica che ogni funzione deve poter modificare solo le variabili indispensabili per il suo funzionamento.
    Cioè prendi la strlen() , la stringa che passi non deve essere modificata, serve solo per contarne gli elementi. Quindi il prototipo indica che la stringa sia const char * . alla funzione infatti non serve modificare la stringa, quindi usa il cost.
    Questo è fatto come norme di sicurezza dei dati passati, eviti modifiche accidentali.
    const char * indica che sta passando un puntatore che punta ad una stringa che non può essere modificata
    const char * const indica che passi un puntatore che non può essere modificato che punta ad una stringa che non può essere modificata
    (cioè non puoi far puntare il puntatore altrove, in virtu' del fatto che la buona programmazione "consiglia" che le funzioni possano modificare solo le variabili strettamente necessarie.
  • Re: Puntatori C

    In realtà non è necessario,anche se utile,dichiarare un puntatore costante nel prototipo. Di fatto ianche i puntatori sono passati per valore,quindi se alteri un puntatore in una funzione non modifichi il puntatore originario, ma solo la copia locale. In ogni caso per evitare di modificare dati che non vanno toccati in modo accidentale,è bene sfruttare la keyword const.
  • Re: Puntatori C

    Grazie del consiglio studieró meglio i puntatori e grazie dell'aiuto
  • Re: Puntatori C

    loopunrolling ha scritto:


    In realtà non è necessario,anche se utile,dichiarare un puntatore costante nel prototipo. Di fatto ianche i puntatori sono passati per valore,quindi se alteri un puntatore in una funzione non modifichi il puntatore originario, ma solo la copia locale. In ogni caso per evitare di modificare dati che non vanno toccati in modo accidentale,è bene sfruttare la keyword const.
    Comunque è assolutamente opportuno evitare di lasciarsi prendere la mano dall'uso di const per i puntatori parametri delle funzioni. Dal K&R (genuflessione), pag. 145:
    Because arguments are passed by value, strcpy can use the parameters s and t in any way it pleases. Here they are conveniently initialized pointers, which are marched along the arrays a character at a time, until the ’\0’ that terminates t has been copied into s. In practice, strcpy would not be written as we showed it above. Experienced C programmers would prefer:
    
    /* strcpy: copy t to s; pointer version 2 */
    void strcpy(char *s, char *t)
    {
        while ((*s++ = *t++) != ’\0’);
    }
    
    Nel seguito della pagina del Testo Sacro, la funzione viene poi ulteriormente ridotta al minimale while (*s++ = *t++);: inerentemente poco robusto, ma estremamente significativo per sottolineare i concetti di eleganza e sintesi consentiti dall'aritmetica dei puntatori e, implicitamente, dal passaggio per valore che li rende sostanzialmente "a perdere" rispetto ai valori noti al chiamante.
  • Re: Puntatori C

    Piccolo O.T.

    M.A.W. visto che hai postato un estrattto dal K&R, mi chiedevo:

    Non parlando inglese come un madrelingua ( onestamente nemmeno come un procugino di 5° grado dell'inglese) , l'edizione Italiana è altrettanto "consigliata"? potrei prendere quella inglese e "tentare" di tradurla per comprenderla , ma , a tuo avviso , è meglio rischiare una traduzione fatta male o andare sull'edizione italiana?
  • Re: Puntatori C

    Mikelius ha scritto:


    Non parlando inglese come un madrelingua ( onestamente nemmeno come un procugino di 5° grado dell'inglese) , l'edizione Italiana è altrettanto "consigliata"? potrei prendere quella inglese e "tentare" di tradurla per comprenderla , ma , a tuo avviso , è meglio rischiare una traduzione fatta male o andare sull'edizione italiana?
    L'inglese tecnico è assolutamente fondamentale per un programmatore. Oltre l'80% dei testi e degli articoli più interessanti si trova unicamente in edizione originale, in lingua inglese.

    In questo caso, l'edizione Pearson è comunque tradotta in maniera accettabile, ma si tratta di un'eccezione alla regola.
  • Re: Puntatori C

    M.A.W. 1968 ha scritto:


    Mikelius ha scritto:


    Non parlando inglese come un madrelingua ( onestamente nemmeno come un procugino di 5° grado dell'inglese) , l'edizione Italiana è altrettanto "consigliata"? potrei prendere quella inglese e "tentare" di tradurla per comprenderla , ma , a tuo avviso , è meglio rischiare una traduzione fatta male o andare sull'edizione italiana?
    L'inglese tecnico è assolutamente fondamentale per un programmatore. Oltre l'80% dei testi e degli articoli più interessanti si trova unicamente in edizione originale, in lingua inglese.

    In questo caso, l'edizione Pearson è comunque tradotta in maniera accettabile, ma si tratta di un'eccezione alla regola.
    si lo so che l'inglese è fondamentale, e lo sto affrondando, mi chiedevo solamente se la versione italiana era ,come le tante traduzioni fatte in modo pessimo. Al momento stavo cercando di studiare dal Deitel (italiano), ma sotto certi aspetti non mi sta convincendo proprio. Vorrei cambiarlo vorrei evitare di prendere la versione inglese perchè è scritta bene per poi rovinarla con una mia interpretazione sbagliata dell'inglese.
Devi accedere o registrarti per scrivere nel forum
10 risposte