Commit 4a867fcd authored by Jomaro Rodrigues's avatar Jomaro Rodrigues

Conteudos recuperados foram colocados nos arquivos

parent 595733cb
......@@ -2,5 +2,228 @@
\begin{document}
Alocação din^amica de memória
Toda e qualquer informação que um programa utiliza está localizada na memória. Mas para que um
programa possa utilizar uma área de memória para armazenar informação, é necess'ario que tal 'area seja
previamente alocada, ou seja, é necessário requisitar ao sistema operacional que reserve uma 'area de
memória para o programa e que a proteja, afim de que outros programas não venham a ler/gravar dados
na região de memória reservada ao programa em quest~ao.
\end{document}
\ No newline at end of file
Imagine se um programa que utilizasse, para armazenar um índice de um for, a mesma área de
memória que outro programa usaria para armazenar uma entrada do teclado. Ou então, que a mesma
área de memória venha a ser utilizada tanto para armazenar dados de um programa quanto para armazenar o c'odigo de outro programa em execução. Cat'astrofes de todos os tipos podem ocorrer em
tais circunst^ancias e se não houver um gerenciamento de memória por parte do sistema operacional,
programar seria um desafio ainda maior, senão inviável.
Alocar uma área de memória significa pedir ao sistema operacional que reserve uma 'area para uso
êxclusivo do nosso programa.
15.1 Alocação estática \Theta aloca,c~ao din^amica
êxistem duas maneiras de se alocar memória em um programa em C.
A primeira maneira é chamada alocação estática. Quando o sistema operacional inicia a execu,c~ao de
um programa, ele aloca tr^es regiões de memória: o segmento de c'odigo, o segmento de dados e o segmento
de pilha.
No segmento de código o sistema operacional coloca o c'odigo do programa. No segmento de dados
são colocadas as variáveis globais, constantes e vari'aveis static. No segmento de pilha s~ao armazenadas,
êntre outras coisas, as variáveis locais das funções do programa.
O problema é que o tamanho desses segmentos 'e fixo (calculado pelo compilador), ou seja, não pode
ser mudado durante a execução de um programa. Imagine que um programa, no meio de uma tarefa,
necessite ler um arquivo de 2 Mb do disco, processá-lo e devolv^e-lo para o disco. Se não for declarado no
código do programa um array de 2 Mb de tamanho, não haverá como processar o arquivo.
Agora suponha que foi declarado um matriz de 2 Mb e o programa consegue manipular o arquivo.
Suponha que esse é um arquivo de configuração e só precisa ser utilizado uma vez durante as 10 horas
êm que o programa ficou em execução. Como o tamanho dos segmentos é fixo (daí o nome aloca,c~ao
êstática), esses 2 Mb de memória alocados estaticamente estariam reservados para o programa, mas não
seriam utilizados (um exemplo de programa mal-comportado).
Ou seja, o programa estaria retendo 2 Mb de memória que poderiam ser usados por outros programas
ê essa memória alocada, mas não utilizada, pode trazer problemas, como impedir que se possa executar
outros programas por falta de memória.
Poderia ser argumentado que pelo menos o programa funciona. Agora suponha que aquele arquivo
tivesse seu tamanho aumentado para 2.5 Mb. Seria necessáro alterar no código o tamanho da matriz e
recompilar o programa cada vez que mudasse o tamanho do arquivo.
O ideal é que esses 2 Mb de memória sejam alocados somente quando forem necessários e sejam
liberados para outros programas quando deixassem de ser úteis.
63
64 CAP
'
ITULO 15. ALOCAC,
~
AO DIN
^
AMICA DE MEM
'
ORIA
'
ê aí que entra a alocação din^amica: a aloca,c~ao din^amica permite que o programa reserve uma área
de memória de qualquer tamanho (dentro dos limites do tamanho da mem'oria, é claro) em tempo de
êxecução. Isso quer dizer que o programa/programador/compilador n~ao precisa saber antecipadamente
o tamanho do bloco de memória de que o nosso programa precisa.
Durante a execução, o programa descobre qual é o tamanho da área de memória que necessita e pede
ao sistema operacional para reservar uma área de memória daquele tamanho. O sistema operacional
reserva a área requisitada (se possível) e devolve para o programa o endereço do primeiro byte da 'area
de memória alocada. No programa, esse endereço pode ser armazenado em um ponteiro.
15.2 sizeof
Antes de apresentar as funções de manipula,cão de memória din^amica, é importante descrever o operador
sizeof.
O operador sizeof é usado para obter o tamanho, em bytes, de um determinado tipo de dado.
A sintaxe geral é:
sizeof(tipo) ou ainda sizeof(variável)
O sizeof retorna o tamanho do tipo passado como par^ametro ou do tipo da variável passada como
par^ametro.
êxemplos:
struct coordf
int x, y, z;
g;
struct coord coordenada1;
sizeof(struct coord); ) obt^em o valor 12 (4 bytes por int )
sizeof(coordenada1); ) obt^em o valor 12 (4 bytes por int )
sizeof(int); ) obt^em o valor 4
êsse operador é extremamente útil quando 'e necessário trabalhar com alocação din^amica de memória
porque permite ao programa determinar o quanto de memória deve ser alocado para um determinado
tipo de dado.
15.3 Função malloc()
A função malloc requisita ao sistema operacional para alocar uma área de memória do tamanho especificado.
êssa função é extremamente útil para gerar matrizes cujo tamanho n~ao 'e possível ser definido antes
de executar o programa. Além disso, existem estruturas de dados (listas, filas, pilhas, entre outras) que
tem tamanho variável e precisam dessa função para serem implementadas.
O protótipo da função malloc é:
void *malloc (unsigned int numero de bytes);
A função recebe como argumento o tamanho em bytes de memória que se deseja alocar e devolve um
ponteiro do tipo void* para o primeiro byte da área de memória alocada.
êm caso de erro (não há memória suficiente), o valor retornado é NULL.Como um ponteiro do tipo
void* não tem tipo definido, pode ser utilizado um casting para especificar que tipo de ponteiro ele deverá
ser.
êm algumas implementações da linguagem C, o compilador limita a quantidade de memória que o
programador pode alocar (ex.: no compilador Borland C 3.0, o máximo é 64Kb).
êxemplo:
#include !stdlib.h?
#include !stdio.h?
int main()f
int* vetor, tamanho;
printf("Digite o tamanho do vetor:");
15.4. FUNC,
~
AO FREE() 65
scanf("%d", &tamanho);
vetor = (int*)malloc(sizeof(int)*tamanho);
g
Observe que para alocar o tamanho correto para um vetor de int, é necessário multiplicar o número
de células que se deseja pelo tamanho do tipo de dado int porque cada c'elula individual 'e do tamanho
int.
15.4 Função free()
A função free é a inversa da fun,c~ao malloc, isto 'e, ela desaloca (libera) uma área de memória previamente
alocada pela função malloc. Abaixo temos a declara,c~ao da fun,c~ao:
void free (void *memblock);
A função recebe um único argumento, o qual é um ponteiro para uma área de memória previamente
alocada com malloc.
/* calcula a media de n notas especificadas pelo usuario */
#include !stdlib.h?
#include !stdio.h?
int main()f
double *notas, media=0;
int i, n;
printf ("Digite o numero de notas: ");
scanf ("%d", &n); /* obtem o numero de notas */
if (n ! 1)f /* verifica se o numero e valido */
printf ("Numero invalido! Deve ser maior que zero."n");
return;
g
/* aloca memoria */
notas = (double*) malloc (n * sizeof(double));
for (i=0; i!n; i++)f /* obtem as notas */
printf ("Digite a %da. nota: ", i+1);
scanf ("%f", (notas+i));
g
/* calcula a media das notas */
for (i=0; i!n; i++)
media += *(notas+i);
media /= n;
printf ("A media das notas e: %f"n", media);
free (notas); /* desaloca a memoria alocada previamente */
g
15.5 Exercícios
1) Faça uma fun,cão gera matriz com os seguintes par^ametros:
geramatriz(int x, int y, int z, int tam);
A função deverá alocar uma matriz de dimens~ao 3, cada dimens~ao dever'a ter tamanho tam e, ao final,
a função retorna a matriz.
2) Crie uma função que seja capaz de redimensionar um vetor previamente alocado (vetor de dimens~ao
1).
66 CAP
'
ITULO 15. ALOCAC,
~
AO DIN
^
AMICA DE MEM
'
ORIA
A função será chamada realoca e receber'a os seguintes par^ametros:
realoca(int *vetor, int tam, int novo tam);
Onde vetor é o vetor que deve ser realocado, tam 'e o tamanho velho do vetor e novo tam 'e o novo
tamanho.
A função deverá ser capaz de preservar o conteúdo de vetor. Se o novo tam for menor que tam, a
informação das células excedentes deve ser descartada.
\end{document}
......@@ -2,5 +2,102 @@
\begin{document}
Argumentos ARGV e ARGC
Algumas vezes é necessário que um programa receba argumentos atrav'es da linha de comando. Um
argumento de linha de comando é o texto digitado após o nome de um programa executável (ex.: pkzip
arquivo1 ) arquivo1 é um argumento do programa executável pkzip).
\end{document}
\ No newline at end of file
Para obter os argumentos da linha de comando, existem dois par^ametros que podem ser acrescentados
`a função main de um programa em C, argc e argv. O par^ametro argc armazenará o número de argumentos
na linha de comando e é um inteiro. Ele será, no mínimo um, j'a que o nome do programa 'e qualificado
como o primeiro argumento.
O par^ametro argv é uma matriz de strings. Todos os argumentos da linha de comando são considerados
strings.
A forma de declaração será sempre a seguinte:
tipo retorno main main(int argc, char *argv[ ])
Observe que os nomes argc e argv são absolutamente arbitrários. Voc^e poder'a atribuir qualquer nome
que preferir.
#include !stdio.h?
void main(int count, char *parametros[ ])f
if (count != 2) f
printf(``Voce esqueceu de digitar o seu nome!"n'');
êxit(0);
g
printf (``Al^o %s'', parametros[1]);
g
Saída: Suponha que o programa acima se chama alo e foi chamado da seguinte forma:
alo Fulano
A saída será:
Al^o Fulano.
Dada a seguinte linha de comando:
prog exec arg1 arg2 arg3 ... argn
Os argumentos arg[1..n] estarão, respetivamente, nas posições 1, 2, 3, ..n do vetor argv.
Portanto, argv[1] é o primeiro argumento passado na chamada do programa.
13.1 Retornando Valores da Função main()
Ainda que nenhum dos programas que voc^e viu até agora tenha demonstrado, 'e possível retornar um
valor inteiro a partir da função main(). Esse valor é retornado ao processo chamador, que usualmente 'e
o sistema operacional. Voc^e pode retornar um valor da função main() usando a declara,c~ao return como
se faz com qualquer outra função.
A interpretação do valor de retorno de uma fun,c~ao depende do processo sobre o qual o programa é
êxecutado.
êxemplo:
51
52 CAP
'
ITULO 13. ARGUMENTOS ARGV E ARGC
/* COMLINE: um programa que executa qualquer comando que e
êspecificado na linha de comando. Retorna um codigo de erro
para o sistema operacional se sua operacao falhar. */
#include !stdio.h?
#include !stdlib.h?
int main(int argc, char *argv[ ])f
int i;
for (i=1; i!argc; i++)
f
if(system(argv[i]))
f
printf(``%s falha"n'', argv[i]);
return -1; /* codigo de falha */
g
g
return 0; /* retorna o codigo de sucesso da operacao */
g
Alguns programadores gostam de declarar especificamente a função main() como void, se ela n~ao
retorna um valor, usando uma declaração como esta:
void main(void);
êntretanto, isso não é necessário. Uma outra abordagem 'e sempre retornar um valor da funç~ao
main().
13.2 Exercício
Faça um programa que receba tr^es argumentos na linha de comando. O primeiro argumento será algum
operador aritmético(+,-,/,*) e o segundo e o terceiro argumento serão números.
O programa deverá imprimir na tela o resultado da operação do segundo argumento pelo terceiro.
êxemplo: Suponha que o programa seja chamado opera:
opera + 2 3 ( deverá imprimir na tela 5
opera * 5 5 ( deverá imprimir na tela 25
\end{document}
This diff is collapsed.
......@@ -2,5 +2,179 @@
\begin{document}
Bibliotecas
Para inserir uma biblioteca em um programa C, basicamente são necessários 2 passos:
\end{document}
\ No newline at end of file
ffl inserir o header no código fonte;
ffl na compilação, se necessário, dever'a ser especificado o arquivo objeto;
No código fonte, a inserção do header sempre segue o seguinte formato:
#include !nomelib?
ou ainda
# include "nomelib"
Sendo que no primeiro formato, o compilador supõe que o arquivo nomelib se encontra em um diretório
padrão para bibliotecas.
No segundo formato, o compilador supõe que o arquivo nomelib se encontra no diretório corrente.
Nos dois formatos é possível especificar explicitamente em que diretório se encontra o arquivo de
header.
êx.: #include !/home/user/biblio.h?
Os headers das bibliotecas mais comuns são:
stdlib.h - contém as funções padr~oes do C;
stdio.h - contém as funções padr~oes de entrada e saída do C;
string.h - contém as funções de manipula,cão de strings;
math.h - contém funções matemáticas.
O segundo passo, referente `a especificação dos arquivos objetos da biblioteca, muda de acordo com o
compilador.
B.1 Bibliotecas: Arquivo objeto \Theta Arquivo header
Uma distinção importante quanto a bibliotecas é entre arquivos objeto e "headers"(cabe,calhos).
Um arquivo objeto é um programa quase inteiramente em código de máquina (linguagem que o
computador entende) a não ser por algumas refer^encias internas tais como, por exemplo, chamadas de
função.
O arquivo header (!bibname?.h) é o arquivo que apenas descreve os nomes das funções daquela biblioteca, al'em de declarar algumas variáveis, constantes, inclusão de outros arquivos, etc. A implementa,c~ao
das funções da biblioteca geralmente não está no header, e sim no arquivo objeto da biblioteca.
Ou seja, o arquivo objeto de uma biblioteca é onde se encontra realmente o código de implementação
de todas as funções da biblioteca.
B.2 Bibliotecas: Lista de funções
Neste ap^endice apresentamos apenas as funções que são usadas direta ou indiretamente neste curso, seja
êm exemplos ou em exercícios.
77
78 AP
^
êNDICE B. BIBLIOTECAS
B.2.1 Funções padrão (stdlib.h )
Funções:
abort abs atexit atof
atoi atol bsearch calloc
div ecvt exit exit
fcvt free fullpath gcvt
getenv itoa labs ldiv
lfind lrotl lrotr lsearch
ltoa makepath malloc max
mblen mbtowc mbstowcs min
putenv qsort rand random
randomize realloc rotl rotr
searchenv splitpath srand trtod
strtol strtold strtoul swab
system time ultoa wctomb
wcstombs
Constantes, tipos de dados e variáveis globais:
div t doserrno environ errno
êXIT FAILURE EXIT SUCCESS fmode ldiv t
NULL osmajor osminor psp
RAND MAX size t sys errlist sys nerr
version wchar t
B.3 Funções de entrada e saída padrão stdio.h
Funções:
clearerr fclose fcloseall fdopen feof ferror
fflush fgetc fgetchar fgetpos fgets fileno
flushall fopen fprintf fputc fputchar fputs
fread freopen fscanf fseek fsetpos ftell
fwrite getc getchar gets getw perror
printf putc putchar puts putw remove
rename rewind rmtmp scanf setbuf setvbuf
sprintf sscanf strerror strerror tempnam tmpfile
tmpnam ungetc unlink vfprintf vfscanf vprintf
vscanf vsprintf vsscanf
Constantes, tipos de dados e variáveis globais:
buffering modes BUFSIZ EOF
F BIN F BUF F EOF
F ERR F IN F LBUF
F OUT F RDWR F READ
F TERM F WRIT FILE
FOPEN MAX fpos t fseek/lseek modes
IOFBF IOLBF IONBF
L ctermid L tmpnam NULL
SEEK CUR SEEK END SEEK SET
size t stdaux stderr
stdin stdout stdprn
SYS OPEN TMP MAX
B.3.1 Funções de manipula,cão de strings (string.h)
Funções:
B.3. FUNC,
~
OES DE ENTRADA E SA
'
IDA PADR
~
AO STDIO.H 79
fmemccpy fmemchr fmemcmp fmemcpy fmemicmp
fmemset fstrcat fstrchr fstrcmp fstrcpy
fstrcspn fstrdup fstricmp fstrlen fstrlwr
fstrncat fstrncmp fstrnicmp fstrncpy fstrnset
fstrpbrk fstrrchr fstrrev fstrset fstrspn
fstrstr fstrtok fstrupr memccpy memchr
memcmp memcpy memicmp memmove memset
movedata movmem setmem stpcpy strcat
strchr strcmp strcmpi strcpy strcspn
strdup strerror strerror stricmp strlen
strlwr strncat strncmp strncmpi strncpy
strnicmp strnset strpbrk strrchr strrev
strset strspn strstr strtok strxfrm
strupr
Constantes, tipos de dados e variáveis globais:
size t
B.3.2 Funções matemáticas (math.h)
Funções:
abs ... acos acosl asin asinl
atan atanl atan2 atan2l atof atold
cabs cabsl ceil ceill cos cosl
cosh coshl exp expl fabs fabsl
floor floorl fmod fmodl frexp frexpl
hypot hypotl labs ... ldexp ldexpl
log logl log10 log101 matherr matherrl
modf modfl poly polyl pow powl
pow10 pow10l sin sinl sinh sinhl
sqrt sqrtl tan tanl tanh tanhl
Constantes, tipos de dados e variáveis globais:
complex (struct) complexl (struct) EDOM
êRANGE exception (struct) exceptionl (struct)
HUGE VAL M E M LOG2E
M LOG10E M LN2 M LN10
M PI M PI 2 M PI 4
M 1 PI M 2 PI M 1 SQRTPI
M 2 SQRTPI M SQRT2 M SQRT 2
mexcep
80 AP
^
êNDICE B. BIBLIOTECAS
\end{document}
\documentclass[apostila.tex]{subfiles}
\begin{document}
GCC - Compilação em Linux
O gcc é um compilador C padrão para Linux, desenvolvido pela GNU, um grupo de desenvolvimento de
software para Linux. Sua sintaxe é:
gcc [opções] arquivo [arq1 arq2 ...]
Onde arquivo é o arquivo fonte ou objeto. Al'em do primeiro arquivo, 'e possível relacionar outros
arquivos que deverão ser compilados e reunidos em um só arquivo executável.
As opções são par^ametros facultativos que alteram o comportamento do gcc. Segue abaixo uma lista
da opções mais comuns:
ffl -c : apenas compila e gera um arquivo objeto (nome de saída padrão é arquivo.o);
ffl -o !nomearq? : especifica que o nome do arquivo de saída será nomearq;
ffl -g : gera informação de "debug", usado por programas de depura,c~ao (ex.: gdb);
ffl -l!lib? : especifica o arquivo objeto das bibliotecas que deverão ser incluídas no processo de
compilação.
'
ê importante observar que a maioria das bibliotecas padrão n~ao precisam ser especificadas através da
opção -l (ex.: stdlib, stdio, string, etc).
êm dúvida, uma consulta do man sobre o comando de uma determinada biblioteca pode ajudar a
êncontrar a biblioteca que deve ser incluída.
Todas as bibliotecas C em linux iniciam com o nome lib, que não deve ser usado na especificaç~ao por
-l, ou seja, apenas a string remanescente (sem lib) deve ser usada.
Por exemplo, o arquivo objeto da biblioteca de funções matemáticas, cujo header é math.h chama-se
libm. Então, para compilar um programa que inclui a math.h basta inserir a opç~ao -lm para incluir a
libm. No linux, geralmente as bibliotecas estão no diretório /usr/lib.
êxemplo:
Suponha que voc^e tenha uma arquivo fonte de nome matriz.c que utiliza a biblioteca math.c, que não
é padrão, e quer gerar um executável de nome matriz. A linha de comando que realiza exatamente o
desejado é:
gcc -o matriz -lm matriz.c
Onde -o matriz especifica o arquivo de saída, -lm especifica que a biblioteca libm deverá ser inclu'ida
ê matriz.c é o nome do arquivo fonte.
81
82 AP
^
êNDICE C. GCC - COMPILAC,
~
AO EM LINUX
\end{document}
......@@ -2,5 +2,229 @@
\begin{document}
êstruturas
Uma estrutura é uma coleção de uma ou mais variáveis agrupadas sob um único nome para facilitar a
sua manipulação. As variáveis de uma estrutura, ao contr'ario das vari'aveis de uma matriz, podem ser de
diferentes tipos de dados. Uma estrutura pode conter quaisquer tipos de dados válidos em C, inclusive
matrizes e até mesmo outras estruturas.
\end{document}
\ No newline at end of file
10.1 A palavra-chave struct
struct rotulof
tipo campo1;
...
tipo campoN;
g [inst^ancia];
A palavra-chave struct é usada para declarar estruturas em C. Ela identifica o início de uma definição
de estrutura e é sempre seguida por um rótulo, que 'e o nome atribuído `a estrutura. A seguir v^em os
membros da estrutura, delimitados entre chaves. Uma inst^ancia, que é uma declaração de uma variável
do tipo da estrutura, também pode ser incluída na definição.
10.2 Definindo e declarando
êxistem basicamente duas maneiras de definir e declarar estruturas em C:
ffl A primeira é colocar uma lista com um ou mais nomes de variáveis imediatamente após a definição
da estrutura, conforme o exemplo a seguir:
struct coord f /* definicao de uma estrutura */
int x;
int y;
g primeira, segunda; /* declaracao de variaveis */
êstas instruções definem o tipo de estrutura coord e declaram duas estruturas (variáveis) deste
tipo, chamadas primeira e segunda.
ffl A segunda maneira é declarar variáveis da estrutura em algum outro ponto do código-fonte. Por
êxemplo:
struct coord f /* definicao de uma estrutura */
int x;
int y;
g;
/* instrucoes adicionais aqui... */
37
38 CAP
'
ITULO 10. ESTRUTURAS
/* declaração de variaveis */
struct coord primeira, segunda;
10.2.1 Acessando os membros de uma estrutura
Os membros individuais de uma estrutura podem ser usados como qualquer outra variável respeitandose as características do seu tipo. Para acessar os membros de uma estrutura, utiliza-se o operador de
membro de estrutura '.' entre o nome da estrutura e o nome do membro.
êxemplo:
struct coord f
int x;
int y;
g primeira, segunda;
primeira.x = 50;
primeira.y = -30;
Uma das vantagens de se utilizar estruturas ao invés de variáveis individuais 'e a capacidade de copiar
informações entre estruturas do mesmo tipo através de uma única instru,cão de atribui,c~ao. Continuando
com o exemplo anterior, a instrução:
segunda = primeira;
é equivalente a:
segunda.x = primeira.x;
segunda.y = primeira.y;
êxemplo:
Recebe informações sobre as coordenadas dos cantos de um ret^angulo e calcula a sua área. Presume
que a coordenada y no canto superior esquerdo é maior que a coordenada y no canto inferior direito, que
a coordenada x do canto inferior direito é maior do que a coordenada x do canto superior esquerdo, e que
todas as coordenadas são positivas.
#include !stdio.h?
struct coordf
int x;
int y;
g;
struct retangf
struct coord esqcima;
struct coord dirbaixo;
g;
void main ()
f
int altura, largura;
long area;
struct retang quadro;
/* recebe as coordenadas */
printf(""nDigite a coordenada x superior esq.:");
scanf("%d", &quadro.esqcima.x);
printf(""nDigite a coordenada y superior esq.:");
10.2. DEFININDO E DECLARANDO 39
scanf("%d", &quadro.esqcima.y);
printf(""nDigite a coordenada x inferior dir.:");
scanf("%d", &quadro.dirbaixo.x);
printf(""nDigite a coordenada y inferior dir.:");
scanf("%d", &quadro.dirbaixo.y);
/* calcula o comprimento e a largura */
largura = quadro.dirbaixo.x - quadro.esqcima.x;
altura = quadro.esqcima.y - quadro.dirbaixo.y;
/* calcula e informa a area */
area = largura * altura;
printf(""nO retangulo tem uma area de %ld unidades.", area);
g
A saída será:
Digite a coordenada x superior esq.: 1
Digite a coordenada y superior esq.: 1
Digite a coordenada x inferior dir.: 10
Digite a coordenada y inferior dir.: 10
O ret^angulo tem uma área de 81 unidades.
OBS.: Quando estruturas são passadas por refer^encia, utilizamos o operador '-?' ao invés do operador
'.'.
êxemplo:
/* Passando argumentos por valor e por referencia */
struct coordf
int x;
int y;
g;
void por valor( struct coord );
void por ref( struct coord * );
void main ()
f
struct coord ponto;
ponto.x = 2;
ponto.y = 4;
printf(""nAntes de chamar por valor(): x = %d, y = %d",
ponto.x,ponto.y);
por valor(ponto); /* chamada por valor */
printf(""nDepois de chamar por valor(): x = %d, y = %d",
ponto.x,ponto.y);
por ref(&ponto); /* chamada por referencia */
printf(""nDepois de chamar por ref(): x = %d, y = %d",
ponto.x,ponto.y);
40 CAP
'
ITULO 10. ESTRUTURAS
g
void por valor(struct coord ponto)
f
ponto.x = ponto.y = 0;
g
void por ref(struct coord *ponto)
f
ponto-?x = ponto-?y = 0;
g
A saída será:
Antes de chamar por valor(): x = 2, y = 4
Depois de chamar por valor(): x = 2, y = 4
Depois de chamar por ref(): x = 0, y = 0
10.3 Exercício
Crie um pequeno banco de dados que armazenará os seguintes dados de um aluno:
ffl código de matrícula
ffl nome
ffl telefone
ffl endereço
</