Funzioni, 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
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
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
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
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
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.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Awesome!
Completion rate improved to 2.63
Funzioni, 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
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
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
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
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
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.
Grazie per i tuoi commenti!