Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Funzioni, Array e Due Puntatori | Puntatori
Fondamenti Di C

bookFunzioni, Array e Due Puntatori

Funzioni con Puntatori

Esploriamo una funzione di base per modificare il valore dei nostri dati. Ad esempio, supponiamo di aver bisogno di una funzione che converta kilo-Ohm in Ohm (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Un tentativo di modificare il valore della variabile r non ha avuto successo. Questo perché la funzione riceve una copia della variabile r, non il valore reale stesso.

Per far funzionare il programma come previsto, è necessario passare l'indirizzo della variabile r alla funzione. Di conseguenza, la funzione Ohm dovrebbe accettare double* invece di solo double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Nota che la variabile r viene referenziata due volte. Dopo aver invocato la funzione Ohm, il valore di r viene modificato. Questo accade perché la funzione ha ricevuto l'indirizzo originale della variabile r, non una semplice copia, e ha quindi modificato il valore a quell'indirizzo specifico.

Inoltre, una funzione può restituire un puntatore a un oggetto che ha generato:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Quando un numero (pX + 1) viene aggiunto a un indirizzo, si ottiene l'indirizzo della cella di memoria successiva! Eseguiamo un ciclo per navigare nella "sequenza" della RAM:

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Hai previsto tre passi avanti. È evidente dagli indirizzi ottenuti che esiste una gerarchia ben definita.

Un array è essenzialmente un indirizzo fisso (rappresentato dal nome dell'array) associato a memoria allocata. Gli indici degli elementi rappresentano il displacement rispetto all'indirizzo dell'elemento iniziale!

Questa nozione può essere verificata con il seguente programma:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Non si attraversa direttamente l'array. Si utilizza esclusivamente il suo indirizzo, in particolare l'indirizzo del suo elemento iniziale.

question mark

Quale affermazione spiega meglio perché una funzione in C può modificare il valore di una variabile quando viene passato un puntatore ad essa, ma non quando viene passata la variabile stessa

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 6. Capitolo 5

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 2.63

bookFunzioni, Array e Due Puntatori

Scorri per mostrare il menu

Funzioni con Puntatori

Esploriamo una funzione di base per modificare il valore dei nostri dati. Ad esempio, supponiamo di aver bisogno di una funzione che converta kilo-Ohm in Ohm (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Un tentativo di modificare il valore della variabile r non ha avuto successo. Questo perché la funzione riceve una copia della variabile r, non il valore reale stesso.

Per far funzionare il programma come previsto, è necessario passare l'indirizzo della variabile r alla funzione. Di conseguenza, la funzione Ohm dovrebbe accettare double* invece di solo double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Nota che la variabile r viene referenziata due volte. Dopo aver invocato la funzione Ohm, il valore di r viene modificato. Questo accade perché la funzione ha ricevuto l'indirizzo originale della variabile r, non una semplice copia, e ha quindi modificato il valore a quell'indirizzo specifico.

Inoltre, una funzione può restituire un puntatore a un oggetto che ha generato:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Quando un numero (pX + 1) viene aggiunto a un indirizzo, si ottiene l'indirizzo della cella di memoria successiva! Eseguiamo un ciclo per navigare nella "sequenza" della RAM:

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Hai previsto tre passi avanti. È evidente dagli indirizzi ottenuti che esiste una gerarchia ben definita.

Un array è essenzialmente un indirizzo fisso (rappresentato dal nome dell'array) associato a memoria allocata. Gli indici degli elementi rappresentano il displacement rispetto all'indirizzo dell'elemento iniziale!

Questa nozione può essere verificata con il seguente programma:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Non si attraversa direttamente l'array. Si utilizza esclusivamente il suo indirizzo, in particolare l'indirizzo del suo elemento iniziale.

question mark

Quale affermazione spiega meglio perché una funzione in C può modificare il valore di una variabile quando viene passato un puntatore ad essa, ma non quando viene passata la variabile stessa

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 6. Capitolo 5
some-alt