Então, tenho feito alguns projetos de aprendizagem em C e estou começando a ficar mais confortável com ponteiros. No entanto, me deparei com alguns fenômenos sobre os quais não consigo encontrar muitas informações.
Basicamente, eu crio um array, para simplificar, estou começando com um array de inteiros:
int x[2] = {1, 3};
Agora, se eu quiser modificar o conteúdo deste array, descobri que posso criar uma função que recebe um ponteiro inteiro como parâmetro, passa x
como argumento e desreferencia x
especificando um índice.
#include <stdio.h>
void foo(int* input){
input[0] = 2;
input[1] = 4;
}
int main(){
int x[2] = {1, 3};
printf("x[0] before: %d\nx[1] before: %d\n", x[0], x[1]);
foo(x);
printf("x[0] after: %d\nx[1] after: %d\n", x[0], x[1]);
}
saída
x[0] before: 1
x[1] before: 3
x[0] after: 2
x[1] after: 4
o que é interessante, mas não vejo isso sendo feito com frequência, então não tenho certeza se é aceitável.
Agora, para a questão maior, por algum motivo, sempre que quero alterar o endereço para o qual o próprio ponteiro aponta, especificando um novo valor e ponteiro e, em seguida, definindo o argumento para esse novo ponteiro, isso só parece funcionar quando eu faço o seguinte:
#include <stdio.h>
#include <stdlib.h>
void foo(int** input){
int x[3] = {2, 4};
int** ptr = x;
*input = *ptr;
}
int main(){
int x[2];
x[0] = 1;
x[1] = 3;
printf("x[0] before: %d\n", x[0]);
printf("x[1] before: %d\n", x[1]);
foo(x);
printf("x[0] after: %d\n", x[0]);
printf("x[1] after: %d\n", x[1]);
return 0;
}
Saída:
x[0] before: 1
x[1] before: 3
x[0] after: 2
x[1] after: 4
Então, tenho várias perguntas para as quais não consigo encontrar uma resposta, provavelmente devido à minha falta de vocabulário técnico:
1: Sempre que passo o array com e sem referência como argumento, por que o argumento se comporta como um array de ponteiros, sem inicializar um array de ponteiros e defini-lo primeiro para o endereço do array? Há alguma consequência não intencional em fazer isso?
2: Se o argumento for um ponteiro, em vez de um ponteiro para um ponteiro, é aceitável passar um ponteiro como argumento para uma função que recebe um ponteiro duplo como parâmetro, como eu fiz? Existe algum comportamento indefinido ao fazer isso que eu deva saber?
3: Por que isso funciona?