ponteiros (parte 1) -...
TRANSCRIPT
![Page 1: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/1.jpg)
1
Aula 07:
- Mapa de memória de um processo
- Ponteiros (parte 1)
MCTA028 – Programação Estruturada
Prof. João Henrique Kleinschmidt
Material elaborado pelo prof. Jesús P. Mena-Chalco
3Q-20108
![Page 2: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/2.jpg)
2
Mapa de memória de um processo
![Page 3: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/3.jpg)
3
Alocação de memória: estática VS Dinâmica
Na execução, um programa é um processo.
Um processo ocupa parte da memória principal, reservada
para:
As instruções, e
A pilha
![Page 4: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/4.jpg)
4
INSTRUÇÕES
Armazena o códigocompilado(na linguagemmáquina)
[~bytes]
PILHA (STACK)
Armazena as variáveis ao longoda execução do programa.
[~Mbytes]
Processo na memória
Tamanho limitado
![Page 5: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/5.jpg)
5
INSTRUÇÕES
[~bytes]
PILHA (STACK)
[~Mbytes]
Processo na memória
HEAP
Espaço de memória principal gerenciado pelo SO.
[~Toda a memória RAM]
Tamanho limitado
![Page 6: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/6.jpg)
6
INSTRUÇÕES
[~bytes]
PILHA (STACK)
[~Mbytes]
Processo na memória
HEAP
Espaço de memória principal gerenciado pelo SO.
[~Toda a memória RAM]
int x;
double M[10][20];
char *c;
double M = malloc(...);
Alocação estática Alocação dinâmica
![Page 7: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/7.jpg)
7
![Page 8: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/8.jpg)
8
Maior elemento em um vetor
← Alocação estática
← Alocação dinâmica
← Alocação estática
![Page 9: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/9.jpg)
9
INSTRUÇÕES PILHA (STACK)
Processo na memória
HEAP
Ponteiros?
Em Java e Python o uso é transparente. Não precisa se preocupar de alocar e liberar memória
![Page 10: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/10.jpg)
10
INSTRUÇÕES PILHA (STACK)
Processo na memória
HEAP
Fenômeno: Stack Overflow
![Page 11: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/11.jpg)
11
Ponteiros
![Page 12: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/12.jpg)
12
Vetores e ponteiros
vetor
...
...int vetor[7] = {1,2,3,4,3,2,1}
![Page 13: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/13.jpg)
13
Vetores e ponteiros
...
...
![Page 14: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/14.jpg)
14
Endereços de memória
16¹²= 281 474 976 710 656
4 bits para representar cada número na base 16.
→ 12*4=48 bits → 2^48 (números diferentes)
![Page 15: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/15.jpg)
15
Large Synoptic Survey Telescope, LSST
http://www.lsst.org/lsst/
Telescopio Grande para Rastreos Sinópticos(Large Synoptic Survey Telescope, LSST):– 8,4 metros– capaz de examinar a totalidade do ceu visible– Norte do Chile (2016)– Camera de 3200 megapixels (~3 Gigapixels)
Planejado para armazenar mais de 30 Terabytes de dados de imagens por noite, mantendoem ~10 anos um banco de dados de 15 Petabytes
![Page 16: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/16.jpg)
16
Grande escala?
1000 kB kilobyte
1000² MB megabyte
1000³ GB gigabyte
1000⁴ TB terabyte
1000⁵ PB petabyte
1000⁶ EB exabyte
1000⁷ ZB zettabyte
1000⁸ YB yottabyte
http://mozy.com/blog/misc/how-much-is-a-petabyte/
![Page 17: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/17.jpg)
17
Endereços e ponteiros
(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.
![Page 18: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/18.jpg)
18
Endereços e ponteiros
Os conceitos de endereço e ponteiro são importantes em
qualquer linguagem de programação.
Na linguagem C é mais visível este conceito.
Requer um esforço para usar os ponteiros.
(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.
![Page 19: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/19.jpg)
19
Endereços
A memória de qualquer computador (arquitetura de Von
Neumann) é uma sequência de bytes.
Cada byte armazena um de 256 possíveis valores.
Os bytes são numerados sequencialmente e o número de um
byte é o seu endereço
(*) Fonte: http://codingfox.com/3-1-computer-memory-and-data-representation/
![Page 20: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/20.jpg)
20
Endereços
...
01010111
11000011
01100100
11100010
...
0x37FD00
0x37FD01
0x37FD02
0x37FD03
![Page 21: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/21.jpg)
21
Endereços
...
01010111
11000011
01100100
11100010
...
0x37FD00
0x37FD01
0x37FD02
0x37FD03
Cada objeto na memória do computador tem um endereço.
![Page 22: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/22.jpg)
22
Endereços
...
01010111
11000011
01100100
11100010
...
37FD00
37FD01
37FD02
37FD03
Geralmente o endereço do objeto é o endereço do 1ro byte.
![Page 23: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/23.jpg)
23
Endereços
Observe o símbolo &
![Page 24: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/24.jpg)
24
Endereços
![Page 25: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/25.jpg)
25
Endereços
Em c o endereço de um objeto é dado pelo operador &
Se x é uma variável, então &x é o seu endereço
int s = -9999
0x89422
-9999
s
![Page 26: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/26.jpg)
26
Endereços
Em c o endereço de um objeto é dado pelo operador &
Se x é uma variável, então &x é o seu endereço
int s = -9999
int *p = &s
0x89422
0x60001
p
p = 0x89422
&p = 0x60001
-9999
0x89422
*p = -9999
s
“p aponta para a s”
“p é o endereço de s”
“p aponta a s”
*p é o mesmo que escrever “s”
![Page 27: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/27.jpg)
27
Endereços
4
8
![Page 28: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/28.jpg)
28
Endereços
Todo ponteiro pode ter o valor NULL.
NULL é uma constante, geralmente vale 0
(definida no arquivo interface stdlib)
0
0x564320
p
int *p = NULL;
0x00000
![Page 29: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/29.jpg)
29
Endereços
Há vários tipos de ponteiros:
P. para caracteres
P. para inteiros
P. para registros
P. para ponteiros para inteiros
P. para função
int* p ;
int *p;
int * p;
← O “*” modifica a variável e não o int (mais aceito)
← Um tipo de dado novo int* (conceitualmente correto)
O compilador C aceita qualquer das formas.
![Page 30: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/30.jpg)
30
exemploPonteiro.c
Operadores unários& → Referência: na frente de uma variável:
Devolve o endereço de memória onde a variável está armazenada
* → Derreferência: na frente de variável ou expressão:
Devolve o valor ou conteúdo do endereço de memória apontadapela variável ou expressão
![Page 31: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/31.jpg)
31
exemploPonteiro.c
![Page 32: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/32.jpg)
32
exemploPonteiro2.c
![Page 33: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/33.jpg)
33
exemploPonteiro3.c
![Page 34: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/34.jpg)
34
exemploPonteiro3.c
![Page 35: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/35.jpg)
35
exemploPonteiro3.c
Por que o código abaixo está errado?
![Page 36: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/36.jpg)
36
Atividade em aula
![Page 37: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/37.jpg)
37
Questão 1
1. Os programas (trechos de código) abaixo possuem erros. Qual(is)? Como deveriam ser?
a)
void main() {
int x, *p;
x = 100;
p = x;
printf(“Valor de p: %d.\n”, *p);
}
//p deveria receber o endereço de x, já que p é um ponteiro (e x não). Ponteiros “armazenam” o endereço para
o qual eles apontam! O código correto seria: p = &x;
b) void troca (int *i, int *j) { int *temp; *temp = *i; *i = *j; *j = *temp; }A variável “temp” não precisava ser um ponteiro, já que apenas precisa armazenar um valor
inteiro, sem precisar apontar para algum lugar. O código correto seria: void troca (int *i, int *j) { inttemp; temp = *i; *i = *j; *j = temp; }
![Page 38: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/38.jpg)
38
Questão 2
2.Quais serão os valores de x, y e p ao final do trecho
de código abaixo?
int x, y, *p;
y = 0;
p = &y; //*p = 0
x = *p; //x = 0
x = 4; //x = 4
(*p)++; //*p = 1, y = 1
--x; //x = 3
(*p) += x; //*p = 4, y = 4
Ao final, temos: x = 3, y = 4, p apontando para y (*p = 4).
![Page 39: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/39.jpg)
39
Questão 3
3. Qual o resultado do código abaixo? Explique cada linha.
int x = 100, *p, **pp;
p = &x;
pp = &p;
printf(“Valor de pp: %d\n”, **pp);
int x = 100, *p, **pp; //x recebe o valor 100, p é um ponteiro para inteiro e pp é
um ponteiro para ponteiro para inteiro
p = &x; //p passa a apontar para o endereço de x (logo, *p tem o valor 100)
pp = &p; //pp passa a apontar para o endereço de p, logo *pp é o valor de pp, que
é o mesmo que p e **pp é o mesmo que *p, que é o mesmo que x (que é igual a
100)
printf(“Valor de pp: %d\n”, **pp); //imprime o valor de **pp, que é igual ao valor
de x, como mencionado na linha acima
![Page 40: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/40.jpg)
40
Questão 4
4. Qual será a saída do programa abaixo para
a) x=3 e y=4 (3 e 18)
b) x=6 e y=9 (6 e 83)
#include <stdio.h>
void func(int *px, int *py)
{
px = py;
*py = (*py) * (*px);
*px = *px + 2;
printf("x = %d, y = %d", *px, *py);
}
void main(void)
{
int x, y;
scanf("%d",&x);
scanf("%d",&y);
func(&x,&y);
printf("x = %d, y = %d", x, y);
}
![Page 41: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/41.jpg)
41
Questão 5
5. Escreva uma função mm que receba um vetor inteiro v[0..n-1], o número de elementos
do vetor e os endereços de duas variáveis inteiras, digamos min e max, e deposite nessas
variáveis o valor de um elemento mínimo e o valor de um elemento máximo do vetor.
Escreva também uma função main que use a função mm.
Ex: void mm(int *v, int n, int *min, int *max)
![Page 42: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min](https://reader030.vdocuments.pub/reader030/viewer/2022020305/5c10904809d3f2126b8cafad/html5/thumbnails/42.jpg)
42
Questão 5
int main() {
int n, i, *vet, minimo, maximo;
printf("Quantos numeros voce deseja digitar? ");
scanf("%d", &n);
vet = malloc(n * sizeof(int));
for (i = 0; i < n; i++) {
printf("Digite o numero de indice %d: ", i);
scanf("%d", &vet[i]);
}
mm(vet, n, &minimo, &maximo);
printf("Minimo: %d. Maximo: %d.\n", minimo,
maximo);
return 0;
}
void mm(int *v, int n, int *min, int *max) {
int i;
*min = v[0];
*max = v[0];
for (i = 1; i < n; i++) {
if (v[i] > *max) {
*max = v[i];
}
else if (v[i] < *min) {
*min = v[i];
}
}
}