Funções, Arrays e Dois Ponteiros
Funções com Ponteiros
Vamos experimentar com uma função básica para modificar o valor dos nossos dados. Por exemplo, imagine que você precisa de uma função que converta kilo-Ohms em Ohms (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; }
Uma tentativa de alterar o valor da variável r não foi bem-sucedida. Isso ocorre porque a função recebe uma cópia da variável r, e não o valor real em si.
Para que nosso programa funcione conforme o esperado, é necessário passar o endereço da variável r para a função. Como resultado, a função Ohm deve aceitar double* em vez de apenas 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; }
Observe que a variável r é referenciada duas vezes. Após a chamada da função Ohm, o valor de r é modificado. Isso ocorre porque a função recebeu o endereço original da variável r, e não apenas uma cópia, e então alterou o valor nesse endereço específico.
Além disso, uma função pode retornar um ponteiro para um objeto que ela criou:
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 um número (pX + 1) é adicionado a um endereço, ele resulta no endereço da próxima célula de memória! Vamos criar um loop para navegar pela "sequência" da 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; }
Você projetou três passos à frente. É evidente, a partir dos endereços derivados, que existe uma hierarquia clara.
Um array é essencialmente um endereço fixo (representado pelo nome do array) juntamente com a memória alocada. Os índices dos elementos representam seu deslocamento a partir do endereço do elemento inicial!
Essa noção pode ser validada com o seguinte programa:
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; }
Você não percorre diretamente o array. Utiliza-se apenas o endereço dele, especificamente o endereço do seu elemento inicial.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Can you explain how passing by address works in more detail?
What are some common mistakes when using pointers in functions?
Can you show an example of pointer arithmetic in a loop?
Awesome!
Completion rate improved to 2.63
Funções, Arrays e Dois Ponteiros
Deslize para mostrar o menu
Funções com Ponteiros
Vamos experimentar com uma função básica para modificar o valor dos nossos dados. Por exemplo, imagine que você precisa de uma função que converta kilo-Ohms em Ohms (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; }
Uma tentativa de alterar o valor da variável r não foi bem-sucedida. Isso ocorre porque a função recebe uma cópia da variável r, e não o valor real em si.
Para que nosso programa funcione conforme o esperado, é necessário passar o endereço da variável r para a função. Como resultado, a função Ohm deve aceitar double* em vez de apenas 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; }
Observe que a variável r é referenciada duas vezes. Após a chamada da função Ohm, o valor de r é modificado. Isso ocorre porque a função recebeu o endereço original da variável r, e não apenas uma cópia, e então alterou o valor nesse endereço específico.
Além disso, uma função pode retornar um ponteiro para um objeto que ela criou:
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 um número (pX + 1) é adicionado a um endereço, ele resulta no endereço da próxima célula de memória! Vamos criar um loop para navegar pela "sequência" da 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; }
Você projetou três passos à frente. É evidente, a partir dos endereços derivados, que existe uma hierarquia clara.
Um array é essencialmente um endereço fixo (representado pelo nome do array) juntamente com a memória alocada. Os índices dos elementos representam seu deslocamento a partir do endereço do elemento inicial!
Essa noção pode ser validada com o seguinte programa:
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; }
Você não percorre diretamente o array. Utiliza-se apenas o endereço dele, especificamente o endereço do seu elemento inicial.
Obrigado pelo seu feedback!