ANHANGUERA ENSINO SUPERIOR
ANHANGUERA ENSINO SUPERIOR
Faculdades de Valinhos
Faculdades de Valinhos
-
-
FAV
FAV
Valinhos, agosto de 2006Valinhos, agosto de 2006
Classifica
Classifica
ç
ç
ão e Pesquisa
ão e Pesquisa
Prof. Dr. Marcelo Augusto Cicogna
C&P
C&P --AULA 2AULA 2
2 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
CONTE
CONTEÚ
ÚDO
DO
¾
¾
Nessa Aula
Nessa Aula
zz Identificadores e PonteirosIdentificadores e Ponteiros
z
z Operadores * e &Operadores * e &
z
z DefiniDefiniçção e Declaraão e Declaraçção de Ponteirosão de Ponteiros
z
z Desmistificando alguns Conceitos da Linguagem CDesmistificando alguns Conceitos da Linguagem C
z
z Expressões com PonteirosExpressões com Ponteiros
z
z RelaRelaçção entre Ponteiros e Vetores/Matrizesão entre Ponteiros e Vetores/Matrizes
z
C&P
C&P --AULA 2AULA 2
3 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
MOTIVA
MOTIVA
ÇÃO
Ç
ÃO
¾
¾ Funcionamento do ExcelFuncionamento do Excel ¾¾ No ExcelNo Excel As c
As céélulas são identificadas por lulas são identificadas por coordenadas coluna/linha.
coordenadas coluna/linha.
Exemplo:
Exemplo:
C
Céélula lula B2B2 possui o valor 10possui o valor 10 C
Céélula lula B3B3 possui o valor 20possui o valor 20
¾
¾ Em linguagem CEm linguagem C
Os identificadores são compostos
Os identificadores são compostos
por nomes definidos pelo
por nomes definidos pelo
usu
usuáário.rio. Exemplo:
Exemplo:
int a =
int a = 1010;;
Mas o identificador a possui um
Mas o identificador a possui um
endere
endereçço na memo na memóória?ria?
?
?
C&P
C&P --AULA 2AULA 2
4 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
MOTIVA
MOTIVA
ÇÃO
Ç
ÃO
¾
¾ EndereEndereçço de uma vario de uma variáávelvel ¾¾ Suponha as variáSuponha as variáveis em Cveis em C 3 vari
3 variááveis:veis:
int int a, b, c;a, b, c; a = a = 1010;; b = b = 2020;; c = a + b = c = a + b = 3030;; ¾
¾ EndereçEndereço das vario das variáveisáveis Fazendo um paralelo com o
Fazendo um paralelo com o
Excel, a forma
Excel, a formaçção de endereão de endereçços os segue a nota
segue a notaçção Coluna/Linha:ão Coluna/Linha:
End
End(a) = B2;(a) = B2; End
End(b) = B3;(b) = B3; End
End(c) = B4;(c) = B4;
¾
¾ ManipulaçManipulação de endereão de endereççosos Cont
Cont(B4) = (B4) = ContCont(B2) + (B2) + ContCont(B3); (B3); Resultado:
C&P
C&P --AULA 2AULA 2
5 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
ENDERE
ENDEREÇ
ÇOS DE MEM
OS DE MEMÓ
ÓRIA
RIA
¾
¾ EndereEndereçços em Cos em C
Em linguagem C, todo
Em linguagem C, todo
identificador possui um
identificador possui um
endere
endereçço de memo de memóória.ria. Identificadores são
Identificadores são
usados para representar
usados para representar
vari
variááveis, constantes e veis, constantes e fun
funçções.ões.
Suponha, por enquanto,
Suponha, por enquanto,
que
que endereendereççosos em em linguagem C sejam
linguagem C sejam
iguais a representa
iguais a representaçção ão de
de coordenadascoordenadasdas das c
céélulas de uma planilha lulas de uma planilha Excel (B1, B2, etc.) Excel (B1, B2, etc.) ¾ ¾ ExemploExemplo int int a, b;a, b; a = a = 1010;; b = b = 2020;; ¾
¾ IlustraçIlustração:ão:
10
B2a
20
B3b
Valor de
“a”
(conteúdo = 10)
Endereço de
“a”
(memória = B2)
C&PC&P --AULA 2AULA 2
6 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
ENDERE
ENDEREÇ
ÇOS DE MEM
OS DE MEMÓ
ÓRIA
RIA
¾
¾ EndereEndereçços em Cos em C Os endere
Os endereçços são os são
representados por
representados por
n
núúmeros em base meros em base hexadecimal
hexadecimal..
Vamos fazer a mesma
Vamos fazer a mesma
analogia de endere
analogia de endereçços os das c
das céélulas de uma lulas de uma planilha Excel (B1, B2,
planilha Excel (B1, B2,
etc.)
etc.) mas, agora, com mas, agora, com
valores em
valores em hexadecimalhexadecimal ¾ ¾ ExemploExemplo int int a, b;a, b; a = a = 1010;; b = b = 2020;; ¾
¾ IlustraçIlustração:ão:
10
FFF2a
Valor de
“a”
(conteúdo = 10)
Endereço de
“a”
(memória = FFF2)
20
b
FFF4 www.numaboa.com.br/informatica/oiciliS/assembler/textos/binHexPort.phpC&P
C&P --AULA 2AULA 2
7 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
ENDERE
ENDEREÇ
ÇOS DE MEM
OS DE MEMÓ
ÓRIA
RIA
¾
¾ Operador &Operador &
Em linguagem C, o
Em linguagem C, o
operardor
operardor&& permite permite determinar o endere
determinar o endereçço o de uma vari
de uma variáável.vel. ¾
¾ ExemploExemplo int
int a = a = 1010;; printf
printf((““%d%d””, &a);, &a); printf
printf((““%x%x””, &a);, &a);
¾ ¾ Exemplo:Exemplo: #include <stdio.h> int main() { int a = 10; /* O conteúdo da variavel a. */
printf("Conteudo: %d\n", a);
/* O endereço da variavel a (int). */
printf("Endereco: %d\n", &a);
/* O endereço da variavel a (hexa). */
printf("Endereco: %x\n", &a);
return (0); }
Aula8_01
&a retorna algo como FFF4
!
!
C&P
C&P --AULA 2AULA 2
8 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna Ilustração
ENDERE
ENDEREÇ
ÇOS DE MEM
OS DE MEMÓ
ÓRIA
RIA
¾
¾ ManipulaManipulaçção de ão de Endere
Endereççosos
Em linguagem C, uma
Em linguagem C, uma
vari
variáável do tipo vel do tipo intint pode pode armazenar endere
armazenar endereçços de os de mem
memóória (porria (poréém, alguns m, alguns compiladores apontarão compiladores apontarão um um warningwarning). ). ¾ ¾ ExemploExemplo int int a, b;a, b; a = a = 1010;; b = &a; b = &a; ¾ ¾ Exemplo:Exemplo: #include <stdio.h> int main() { int a = 10; int b; b = &a; /* O conteúdo da variavel b. */ printf("Conteudo: %d\n", b);
/* O endereço da variavel b (hexa). */
printf("Endereco: %x\n", &b);
return (0); } Aula8_01
10
FFF2a
FFF2
FFF4b
C&P
C&P --AULA 2AULA 2
9 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
PONTEIROS
PONTEIROS
¾
¾ DeclaraDeclaraçção: Operador *ão: Operador * Tipo
Tipo* Nome_Ponteiro;* Nome_Ponteiro;
Em linguagem C, para
Em linguagem C, para
poder armazenar
poder armazenar
endere
endereçços de memos de memóória, ria, recomenda
recomenda--se utilizar se utilizar ponteiros ponteiros. . ¾ ¾ ExemploExemplo int int a = a = 1010; ; int int* b;* b; b = &a; b = &a; ¾ ¾ Exemplo:Exemplo: #include <stdio.h> int main() { int a = 10; int* c; c = &a;
/* O conteúdo da variavel c (hexa). */
printf("Conteudo: %x\n", c); return (0); } Aula8_01 Ilustração
10
FFF2a
FFF2
FFF4b
Ponteiros são variPonteiros são variááveis que veis que armazenam em seu contearmazenam em seu conteúúdo do apenas endere
apenas endereçços (os (HexaHexa).).
!
!
C&P
C&P --AULA 2AULA 2
10 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
PONTEIROS
PONTEIROS
¾¾ Acesso: Operador *Acesso: Operador * Pode
Pode--se acessar o se acessar o
conte
conteúúdo que um do que um ponteiro possui tamb
ponteiro possui tambéém m atrav
atravéés do operador s do operador ** ¾ ¾ ExemploExemplo int int a = a = 1010; ; int int* c;* c; c = &a; c = &a; (*c) = (*c) = 2020; ; ¾
¾ Paralelo com o ExcelParalelo com o Excel a = 10; a = 10; End(c) = End(a); End(c) = End(a); Cont Cont(c) = 20;(c) = 20; ¾ ¾ Exemplo:Exemplo: #include <stdio.h> int main() { int a = 10; int* c; /* O conteúdo da variavel a. */
printf("Conteudo: %d\n", a);
c = &a; (*c) = 20;
/* O conteúdo da variavel a. */
printf("Conteudo: %d\n", a);
return (0); }
Aula8_01
int* c armazena algo como FFF4 (*c) acessa o cont. do endereço
!
!
Ilustração10
FFF2a
FFF2
FFF4c
20
C&P
C&P --AULA 2AULA 2
11 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
DESMISTIFICANDO...
DESMISTIFICANDO...
¾
¾ FunFunçção ão scanfscanf() e &() e & Foi dito no in
Foi dito no iníício do cio do curso que as fun
curso que as funçções ões scanf
scanf()() e e fscanffscanf()() necessitavam de um
necessitavam de um
operador
operador && na passagem na passagem
de vari
de variááveis para leitura. veis para leitura. ¾
¾ ExemploExemplo int
int a = a = 1010; ; scanf
scanf((““%d%d””, &a); , &a); Motivo:
Motivo: a funa funçção ão scanfscanf()() necessita de um
necessita de um
endere
endereççoo para alterar o para alterar o
conte
conteúúdodode uma de uma vari
variáável. vel.
¾ ¾ Exemplo:Exemplo: #include <stdio.h> int main() { int a = 10; /* Sem &. */ scanf(”%d”, a);
printf("Conteudo: %d\n", a);
/* Com &. */
scanf(”%d”, &a);
printf("Conteudo: %d\n", a);
return (0); }
Aula8_02
C&P
C&P --AULA 2AULA 2
12 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
DESMISTIFICANDO...
DESMISTIFICANDO...
¾¾ Vetores são Ponteiros!Vetores são Ponteiros! Em linguagem C, o
Em linguagem C, o
identificador
identificador de um de um vetor
vetor criado, por criado, por
exemplo, como vetor de
exemplo, como vetor de
inteiros:
inteiros:
int
int vetvet[[33] = {] = {11, , 22, , 33}; };
é
é, internamente, , internamente,
representado como um
representado como um
ponteiro
ponteiro para o para o
endere
endereçço da o da primeiraprimeira posi
posiççãoãodo vetor. do vetor. int*
int* vetvet; ;
1
A12
B13
C11
FFF22
FFF43
FFF6 ¾¾ IlustraçIlustração (Excel):ão (Excel):
¾
¾ IlustraçIlustração (em C):ão (em C):
A1
A2vet
FFF2
FFF8vet
O que O que signifcasignifca ((vetvet + 2)+ 2)??
?
C&P
C&P --AULA 2AULA 2
13 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
DESMISTIFICANDO...
DESMISTIFICANDO...
¾
¾ Chamada por ReferênciaChamada por Referência Exemplo 1:
Exemplo 1:passagem de um passagem de um parâmetro inteiro
parâmetro inteiro nnpor por
referência
referência
O escopo da fun
O escopo da funçção possui ão possui uma referência ao escopo
uma referência ao escopo
externo que a chamou.
externo que a chamou.
Com essa referência pode
Com essa referência pode- -se alterar o valor da
se alterar o valor da
vari
variáável do escopo externo, vel do escopo externo,
atrav
atravéés do uso de ponteiros.s do uso de ponteiros.
#include <stdio.h> void Imprime_linhas(int* n); int main() { int a = 5; Imprime_linhas(&a);
printf(“\tPrograma Teste”); Imprime_linhas(&a); return (0); } void Imprime_linhas(int* n) { int i;
for (i=0; i<(*n); i++)
printf(“\n---\n”); (*n) = 1; } Aula6_03B ¾ ¾ Exemplo:Exemplo: C&P
C&P --AULA 2AULA 2
14 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
PONTEIROS E VETORES
PONTEIROS E VETORES
¾¾ Indexando vetores a Indexando vetores a ponteiros
ponteiros
Matrizes e ponteiros tem uma
Matrizes e ponteiros tem uma
estreita liga
estreita ligaçção.ão. char char strstr[[4040];]; char char* p;* p; char char a;a; p = p = strstr;; O ponteiro p foi
O ponteiro p foi inicializadoinicializadocom com o endere
o endereçço do vetor o do vetor strstr..
a = a = strstr[4];[4]; a = *(p+4);
a = *(p+4);
As duas linhas de comandos são
As duas linhas de comandos são
equivalentes. equivalentes. ¾ ¾ Exemplo:Exemplo: #include <stdio.h> int main() { int i; char str[10]; char* p; strcpy(str, “Aprovado”); p = str;
for(i=0; i<str[i]; i++) printf(“%c", str[i]); printf(“\n”); for(i=0; (*p); i++, p++) printf(“%c", (*p)); return (0); } Aula8_03
Embora o nome de um vetor
Embora o nome de um vetor
(matriz) seja um ponteiro, seu
(matriz) seja um ponteiro, seu
endere
endereçço o nãonão pode ser alterado.pode ser alterado.
!
C&P
C&P --AULA 2AULA 2
15 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
PONTEIROS E VETORES
PONTEIROS E VETORES
¾
¾ Chamada por referênciaChamada por referência A passagem de um
A passagem de um
parâmetro
parâmetro vetvet[10][10]que que representa de um vetor de
representa de um vetor de
inteiros com 10 elementos.
inteiros com 10 elementos.
Ao passarmos um vetor (ou
Ao passarmos um vetor (ou
uma matriz) como
uma matriz) como
argumento para uma
argumento para uma
fun
funçção estamos fazendo ão estamos fazendo uma chamada por
uma chamada por
referência
referência. .
Isto significa que as
Isto significa que as
altera
alteraçções ocorridas nos ões ocorridas nos parâmetros dentro da
parâmetros dentro da
fun
funçção ão afetarãoafetarãoos valores os valores das vari
das variááveis passadas veis passadas como argumento.
como argumento.
#include <stdio.h>
void Imprime(int vet[10]); int main()
{
int i, x[10];
for(i=0; i<10; i++) x[i] = i; Imprime(x);
Imprime(x); /*Novos valores*/
return(0); }
void Imprime(int vet[10]) {
int i;
for(i=0; i<10; i++)
printf(“%2d ”, vet[i]); printf(“\n”);
for(i=0; i<10; i++) vet[i] *= -1; } Aula6_07 ¾ ¾ Exemplo:Exemplo: C&P
C&P --AULA 2AULA 2
16 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
EXPRESSÕES COM PONTEIROS
EXPRESSÕES COM PONTEIROS
¾
¾ AritmAritméética: Aditica: Adiçção e Subtraão e Subtraççãoão Pode
Pode--se incrementar ou se incrementar ou decrementardecrementar um ponteiro usando os operadores
um ponteiro usando os operadores
++ ++ ee–– ¾ ¾ ExemploExemplo int int a = a = 1010; ; int int* c;* c; c = &a; c = &a; c++; c++; c c----;; c = c + 2; c = c + 2; Ilustração
10
A1a
A1
C1c
A2
C1c
A1
C1c
A3
C1c
CUIDADO!
CUIDADO!
C&P
C&P --AULA 2AULA 2
17 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna ©
©2006 FAV 2006 FAV --ClassificaClassificaçção & Pesquisaão & Pesquisa..
EXPRESSÕES COM PONTEIROS
EXPRESSÕES COM PONTEIROS
¾
¾ InicializaInicializaçção de Ponteiros ão de Ponteiros Cuidado
Cuidado: nenhum ponteiro pode ser usado : nenhum ponteiro pode ser usado antes de ser inicializado.
antes de ser inicializado.
¾
¾ Erro ComumErro Comum int int a;a; int int* p; * p; a = a = 1313; ; (*p) = a; (*p) = a; ¾
¾ Importante: Importante: o programa acima sero programa acima seráá compilado e executado. Por
compilado e executado. Poréém, os m, os resultados são imprevis
resultados são imprevisííveis!veis!
C&P
C&P --AULA 2AULA 2
18 Pr of . D r. Ma rcelo Augusto Cicogna Pr of . D r. Ma rcelo Augusto Cicogna
EXPRESSÕES COM PONTEIROS
EXPRESSÕES COM PONTEIROS
¾
¾ Exemplos de expressões Exemplos de expressões int int* p; * p; p++;p++; Incrementa o endere Incrementa o endereçço de p o de p na mem
na memóóriaria
(*p)++;(*p)++;
Incrementa o conte
Incrementa o conteúúdo de p do de p na mem
na memóóriaria
*(p++);*(p++);
Incrementa o endere
Incrementa o endereçço de p o de p na mem
na memóória e retorna o ria e retorna o
conte
conteúúdo desta posido desta posiçção.ão.
¾ ¾ Exemplo:Exemplo: #include <stdio.h> int main() { int x, y = 0; int* p; p = &y; x = (*p); x = 4; (*p)++; x--; (*p) = (*p) + x;
printf(“y = %d\n", y);
return (0); }