Memory Adresses

Quando criamos uma variável, o que está guardado nela fica guardado fisicamente no computador, na sua memória, RAM, que é a memória que a computador usa quando executa programas.

int main () {
	int age = 30 ;

	printf ("%p", &age) ; // p de Pointer // & dá o endereço fisico da variável
                                        // &age é um Pointer
return 0 ;
}

== 0060FF00 // Por exemplo
/* Este numero é o local da RAM aonde fica guardado o valor 30 da variável age
É como fosse o nome do local aonde a informação está guardada */
// C usa esta memory adresses para buscar o valor da variável

Pointers

Um pointer é um data type para uma memory adresse.

Para criarmos uma variável pointer, não sabemos exatamente a memory adresse, então quando criamos um pointer, queremos guardar a memory adresse de uma variável que já existe, da seguinte maneira :

int main () {
	int age = 30 ;
	int * pAge = &age ;       // Pointer variable da variável age
	double gpa = 3.4 ;
	double * pGpa = &gpa ;    // Pointer variable da variável gpa
	char grade = 'A' ;
	char * pGrade = &grade ;  // Pointer variable da variável grade

	printf ("%p", &age) ;     // Este pointer da a memory adresse da variável age
	// ou
  printf ("%p", pAge) ;     // Este pointer da a memory adresse da variável age
  printf ("%d", *pAge) ;    /* **Dereferecing** a pointer - desta maneira o programa vai
                               buscar o que está guardado na memory adresse pAge
                               que neste caso, é o valor 30 */
                                       
return 0 ;
}

Logo :

Exemplo de utilização :

Como podemos retornar 2 inteiros com uma função auxiliar para a main, sendo que só podemos usar um return ?

Exemplo de uma função que recebe dois ints e dá os mesmos dois ints mas o maior deles será o primeiro elemento e o menor será o segundo

void maxMin (int x, int y) {

	int t;
	if (x<y) {
		t = x;
		x = y;
		y = t;
		};
}
// Esta função funciona e os elementos trocam, mas a não passa estas informações para a main
// Logo, podemos usar as memorys adresses das das variáveis, assim as informações serão passadas para a main

void maxMin (int *x, int *y) { // Os data types dos argumentos da funções são pointers

	int t;
	if (x<y) {
		t = *x;  // Guardar o valor que está dentro da variável x dentro da variável t
		*x = *y; // O valor que está dentro da variável y vai ser guardado dentro da variável x
		*y = t;  // O valor da variável t vai ser guardado dentro da variável y
		};
}

int main () {
	int x = 3, y = 6, z;

	maxMin (&x, &y); // Chamar a função com as memorys adresses das variáveis
	
	printf ("%d %d \\n", x, y); // Imprimir o valor das variáveis

	return 0;
}

== 6 3

Alocação de Memória