Sistemas Computacionais - Linguagem C: ponteiro, endereço e memória

9.7k views2310 WordsCopy TextShare
UNIVESP
univesp.br Eixo de Computação - COM210 Univesp - Universidade Virtual do Estado de São Paulo Profes...
Video Transcript:
[MÚSICA] [MÚSICA] >> [ALESSANDRA] OLÁ, PESSOAL! BEM-VINDOS À SEMANA CINCO DA DISCIPLINA DE SISTEMAS COMPUTACIONAIS. NESSA SEMANA, NÓS VAMOS APRENDER CONTEÚDOS BASTANTE INTERESSANTES.
NÓS VAMOS FALAR SOBRE ALGUNS CONCEITOS DE LINGUAGEM "C". NESSE CONTEXTO, A GENTE VAI FALAR DE ESTRUTURA, PONTEIROS, PARA QUE POSSAMOS DEPOIS FAZER SIMULAÇÃO DE ALGUNS PROCESSOS DA DISCIPLINA, COMO OS QUE A GENTE VIU NA SEMANA TRÊS, PAGINAÇÃO E PARTICIONAMENTO FIXO. VAMOS LÁ?
BOM, PESSOAL, NA AULA DE HOJE, NÓS VAMOS FALAR SOBRE ALGUNS CONCEITOS DA LINGUAGEM "C", PRINCIPALMENTE A QUESTÃO DE PONTEIROS E ENDEREÇOS NA MEMÓRIA. ESSA PRIMEIRA FIGURA QUE VOCÊS ESTÃO VENDO AÍ, VOCÊS VÃO VER A ESTRUTURA BÁSICA DE UM PROGRAMA "C". NA PARTE INICIAL, VOCÊS VÃO VER QUE SÃO AS BIBLIOTECAS E AS MACROS.
AS BIBLIOTECAS SÃO BIBLIOTECAS DE FUNÇÕES QUE DEPOIS A GENTE VAI USAR AQUI NO NOSSO PROGRAMA PRINCIPAL. DEPOIS, VOCÊ TEM UMA SEÇÃO DE DECLARAÇÃO DE FUNÇÕES E VARIÁVEIS GLOBAIS. E EM SEGUIDA, UMA SEÇÃO DE DEFINIÇÃO DE FUNÇÕES.
E AÍ VEM A PARTE DO PROGRAMA PRINCIPAL, QUE VEM COM A PALAVRINHA RESERVADA "MAIN". O ABRE CHAVES É O COMEÇO, O INÍCIO DO NOSSO BLOCO. ESSE É O BLOCO PRINCIPAL.
E O FECHA CHAVES É O FIM DESSE BLOCO PRINCIPAL. BOM, NÓS VAMOS FALAR DE PONTEIROS. O QUE É UM PONTEIRO?
É UMA VARIÁVEL QUE CONTÉM NELA O ENDEREÇO DE MEMÓRIA, COMO A GENTE VINHA FALANDO. A GENTE TEM A NOSSA MEMÓRIA E A NOSSA MEMÓRIA TEM ENDEREÇOS. E ESSES ENDEREÇOS, NA VERDADE, CORRESPONDEM À POSIÇÃO, AO ENDEREÇO DE UMA OUTRA VARIÁVEL.
POR ISSO QUE A GENTE FALA QUE O PONTEIRO APONTA PRA OUTRA VARIÁVEL, PORQUE ELE GUARDA O ENDEREÇO DE UMA OUTRA VARIÁVEL. POR QUE NÓS USAMOS? UMA DAS FUNÇÕES PRA USAR PONTEIRO É A IDEIA DE ALOCAÇÃO DINÂMICA DE MEMÓRIA.
SUGIRO QUE VOCÊS DEEM UMA OLHADINHA NESSE ASSUNTO SE TIVEREM OPORTUNIDADE. ELE AUMENTA A EFICIÊNCIA DAS ROTINAS E TAMBÉM ELE OFERECE UM MEIO DA GENTE MODIFICAR O VALOR DAS VARIÁVEIS QUE SÃO PASSADAS NOS ARGUMENTOS DAS NOSSAS FUNÇÕES. ENTÃO, A GENTE VAI BRINCAR UM POUQUINHO COM ISSO NA AULA DE HOJE.
NESSE ESQUEMA DA FIGURA, VOCÊS VÃO VER QUE EU REPRESENTEI UMA MEMÓRIA. E AQUI, DO SEU LADO ESQUERDO, VOCÊS VÃO VER OS ENDEREÇOS QUE EU DEFINI PRA ESSA MEMÓRIA. NESSA MEMÓRIA, A GENTE TEM UMA VARIÁVEL INTEIRA AQUI NO ESPAÇO 1.
003, UMA VARIÁVEL "FLOAT" - "FLOAT" É O REAL - NO ESPAÇO 1. 004. ESTÁ MEIO MAL COLOCADO AQUI, MAS DÁ PRA ENTENDER, NÉ?
E AÍ, A GENTE TEM UM PONTEIRO AQUI, QUE ELE ESTÁ GUARDANDO O ENDEREÇO DA MEMÓRIA ONDE ESTÁ ARMAZENADA A VARIÁVEL 25. ENTÃO, ELE GUARDA O ENDEREÇO 1. 003.
ENTÃO, POR ISSO QUE PONTEIRO É UM TIPO DE VARIÁVEL DIFERENTE. EM VEZ DELE GUARDAR UM VALOR, UM CONTEÚDO, ELE GUARDA COMO VALOR O ENDEREÇO DE UMA VARIÁVEL. ENTÃO, COMO QUE A GENTE DECLARA UM PONTEIRO?
A FORMA GERAL DE DECLARAÇÃO DE PONTEIRO É VOCÊ DIZER QUAL É O TIPO DE VARIÁVEL QUE ELE VAI APONTAR, ENTÃO ESSE É O TIPO DO PONTEIRO; O ASTERISCO, QUE DEFINE; E O NOME DO SEU PONTEIRO. ENTÃO, QUALQUER TIPO VÁLIDO EM "C", O IDENTIFICADOR É UM IDENTIFICADOR VÁLIDO EM "C" E O ASTERISCO É O SÍMBOLO DE DECLARAÇÃO DE PONTEIRO, ELE INDICA AÍ QUE O IDENTIFICADOR VAI APONTAR PARA UMA VARIÁVEL DAQUELE TIPO QUE ESTAVA ESCRITO ANTES. ENTÃO, AQUI NÓS TEMOS ALGUNS EXEMPLOS.
"INT ASTERISCO P", É UM PONTEIRO CHAMADO "P" QUE APONTA PRA UMA VARIÁVEL DO TIPO INTEIRO. "CHAR ASTERISCO P1", É UM PONTEIRO QUE O IDENTIFICADOR É "P1", CHAMADO "P1", QUE APONTA PRA UMA VARIÁVEL DO TIPO "CHAR". "PF1", É UM PONTEIRO PRA "FLOAT", E "PF2" É UM PONTEIRO PRA "FLOAT".
TUDO BEM? ENTÃO, AQUI ESSE SLIDE MOSTRA PRA VOCÊS, QUANDO TRABALHAR COM PONTEIRO, A PRECEDÊNCIA DOS OPERADORES. NÓS VAMOS VER DOIS OPERADORES MUITO IMPORTANTES PRA PONTEIRO, QUE É O "E COMERCIAL" E O ASTERISCO.
MAS DEPOIS A GENTE TEM OUTROS OPERADORES AÍ, A GENTE VAI FALAR SOBRE O "++" E O "--", QUE SÃO OS INCREMENTOS. ESSE É O INCREMENTO PÓS E DEPOIS TEM O INCREMENTO PRÉ. ENTÃO, É "++ PONTEIRO" E "-- PONTEIRO".
AQUI SERIA O CONTRÁRIO, "PONTEIRO ++" E "PONTEIRO --". AÍ AS OPERAÇÕES BÁSICAS, MULTIPLICAÇÃO, DIVISÃO, MOD, MAIS E MENOS. E AÍ EXISTEM OUTROS QUE AGORA A GENTE NÃO VAI VER, QUE EM CURSOS BÁSICOS DE "C" VOCÊS CONSEGUEM MAIS INFORMAÇÕES.
VAMOS FALAR DO OPERADOR "E COMERCIAL". ELE É UM OPERADOR UNÁRIO, SIGNIFICA QUE ELE MODIFICA APENAS UM OPERANDO. E ESSE OPERADOR, A FUNÇÃO DELE É DEVOLVER O ENDEREÇO DE MEMÓRIA DO OPERANDO.
ENTÃO, A GENTE USA MUITO ISSO QUANDO A GENTE ESTÁ FAZENDO INICIALIZAÇÃO DE PONTEIRO. ENTÃO, VAMOS LÁ, VAMOS DEFINIR UM PONTEIRO "INT ASTERISCO P", VÍRGULA E UMA VARIÁVEL "ACM". ENTÃO, AQUI É UMA VARIÁVEL, EU NÃO TENHO ASTERISCO, ENTÃO, É UMA VARIÁVEL COMUM.
ENTÃO, EU ESTOU DEFININDO UM PONTEIRO PRA INTEIRO E UMA VARIÁVEL CHAMADA "ACM" E JÁ ESTOU ATRIBUINDO PRA ESSA VARIÁVEL "ACM" O VALOR DE 35. O QUE EU ESTOU FAZENDO AQUI? EU ESTOU NESSA LINHA INICIALIZANDO O MEU PONTEIRO.
POR QUÊ? EU ESTOU DIZENDO QUE O PONTEIRO "P" VAI RECEBER O ENDEREÇO, O OPERADOR ENDEREÇO, DA MINHA VARIÁVEL "ACM". ENTÃO, O "P" RECEBE O ENDEREÇO DE "ACM".
NA NOSSA FIGURINHA, "ACM" ESTÁ NO ESPAÇO, NO ENDEREÇO 1. 292. ENTÃO, APÓS ESSA OPERAÇÃO, O "P" VAI ESTAR O QUE COM O VALOR AQUI?
1. 292. ENTÃO, O "P" ESTÁ APONTANDO PRA ESSA POSIÇÃO DE MEMÓRIA ONDE "ACM" ESTÁ GUARDANDO O VALOR DE 35.
ENTÃO, O VALOR DE "P" É 1. 292, E O CONTEÚDO É O VALOR DO ENDEREÇO. ENTÃO, QUAL É O VALOR DE "P"?
1. 292. QUAL QUE É O CONTEÚDO DE "P"?
35. POR QUÊ? É O VALOR DO ENDEREÇO APONTADO POR "P".
QUAL QUE É O VALOR DO ENDEREÇO APONTADO POR "P"? 35. E AÍ, A GENTE PODE INICIALIZAR TAMBÉM DE MODO "NULL".
QUANDO VOCÊ QUER QUE O PONTEIRO NÃO APONTA PRA NADA INICIALMENTE, VOCÊ PODE FAZER "P" RECEBE ZERO OU "P" RECEBE "NULL" - DADO QUE ESSE "P" É AQUELE PONTEIRO QUE A GENTE DEFINIU LÁ EM CIMA. AQUI A GENTE TEM UM OPERANDO ASTERISCO. .
. OPERADOR, DESCULPA. OPERADOR UNÁRIO, DEVOLVE O VALOR DA VARIÁVEL APONTADA, COMO A GENTE FEZ LÁ NO SLIDE ANTERIOR.
ENTÃO, AQUI É A DEFINIÇÃO, ESSE ASTERISCO AQUI É OUTRA COISA, ESSE ASTERISCO É PARA DEFINIR O "P", QUE É UM PONTEIRO, AÍ EU DEFINI UMA VARIÁVEL "Q" - VEJAM QUE NÃO TEM ASTERISCO - E UMA VARIÁVEL "ACM", E ATRIBUI PRO "ACM" 35. FIZ A MESMA COISA, "P" RECEBE ENDEREÇO DE "ACM". O QUE SIGNIFICA AQUI ESSA INICIALIZAÇÃO?
"P" PASSA A APONTAR PRA "ACM". ENTÃO, LÁ NA NOSSA MEMÓRIA O "P" RECEBE O ENDEREÇO DE "ACM", QUE É 1. 292.
E AGORA, O QUE EU FIZ? EU PEGUEI AQUELA VARIÁVEL "Q" E FALEI PRA "Q": "OH, RECEBE O CONTEÚDO APONTADO POR 'P'". ENTÃO, AGORA O "Q" VAI RECEBER O CONTEÚDO DE "P".
QUEM "P" APONTA? "ACM". O "Q" VAI RECEBER 35.
ENTÃO, O VALOR DE "Q" É 35, O MESMO DA VARIÁVEL APONTADA POR "P". NÃO CONFUNDIR OS OPERANDOS DE PONTEIROS "E COMERCIAL", O ENDEREÇO, E O ASTERISCO, QUER DIZER, O VALOR NO ENDEREÇO, COM O "AND BIT A BIT", QUE É UM OPERADOR QUE DEPOIS, MAIS PARA FRENTE, SE VOCÊS TIVEREM A OPORTUNIDADE DE CONSULTAR, É BASTANTE INTERESSANTE, E O ASTERISCO NÃO CONFUNDIR COM O SINAL DE MULTIPLICAÇÃO. OS OPERADORES DE PONTEIROS TÊM PRECEDÊNCIA, QUE ERA LÁ O ASTERISCO E O "E COMERCIAL", MAIOR QUE TODOS OS OPERADORES QUE SÃO ARITMÉTICOS.
EXCETO O MENOS, QUE NEGATIVA O NÚMERO. TECNICAMENTE, PONTEIRO PODE APONTAR PARA QUALQUER POSIÇÃO DE MEMÓRIA, MAS A GENTE SABE QUE O SISTEMA OPERACIONAL, POR UMA QUESTÃO DE SEGURANÇA, RESERVA ALGUNS ENDEREÇOS DE MEMÓRIA, E AÍ A GENTE NÃO CONSEGUE FAZER PONTEIRO DE PROGRAMA DE USUÁRIO APONTAR PARA AQUELES ENDEREÇOS, PORQUE SENÃO A GENTE MODIFICARIA OS REGISTRADORES DO SISTEMA OPERACIONAL. ENTÃO, POR SEGURANÇA, A GENTE NÃO DEVE E NÃO CONSEGUE FACILMENTE FAZER ISSO.
O TIPO DO PONTEIRO TAMBÉM É IMPORTANTE, PORQUE, POR EXEMPLO, AQUI NESSE PROGRAMINHA A GENTE ESTÁ DEFININDO UMA VARIÁVEL "X" DO TIPO "FLOAT" E UMA VARIÁVEL "Y" DO TIPO "FLOAT". E AÍ, PRA "X" A GENTE ESTÁ ATRIBUINDO O VALOR REAL - "FLOAT" É REAL - 3. 5 E PARA O "Y" TAMBÉM.
NA PRÓXIMA LINHA, A GENTE ESTÁ FALANDO QUE NÓS VAMOS FAZER UM PONTEIRO PARA INTEIRO. EU ATÉ POSSO, DEPENDENDO DO COMPILADOR, CONSEGUIR EXECUTAR ISSO AQUI. O QUE É ISSO?
"P" APONTA PARA O ENDEREÇO DE "X". ENTÃO, ELE VAI APONTAR PARA "X". SÓ QUE A HORA QUE EU FIZER "Y" RECEBER O CONTEÚDO DO PONTEIRO DE "P", DO VALOR DO "P", O QUE VAI ACONTECER?
VAI DAR UM ERRO. EU ESTOU FAZENDO CASTING DE TIPOS, ISSO DAQUI NÃO VAI FICAR LEGAL. ENTÃO, EM PONTEIROS, A GENTE TRABALHA NORMALMENTE COM TRÊS OPERAÇÕES: UMA DE ATRIBUIÇÃO DE PONTEIROS, OUTRA ARITMÉTICA DE PONTEIROS E A OUTRA COMPARAÇÃO DE PONTEIROS.
ENTÃO, PRIMEIRAMENTE, VAMOS FALAR LÁ DA. . .
ATRIBUIÇÃO. IGUAL QUALQUER ATRIBUIÇÃO DE VARIÁVEL QUE VOCÊS FAZEM EM PROGRAMA "C" OU OUTROS PROGRAMAS. VOCÊ AQUI ESTÁ DEFININDO UMA VARIÁVEL "INT X" QUE RECEBE 8, E DOIS PONTEIROS, "P1" E "P2", PONTEIROS PRA VARIÁVEIS INTEIRAS TAMBÉM.
AÍ VOCÊ ESTÁ DIZENDO: "'P1', APONTA PARA 'X'". "P1" RECEBE O ENDEREÇO DE "X", ESSA É UMA ATRIBUIÇÃO PARA O PONTEIRO. E DEPOIS?
VOCÊ ESTÁ ATRIBUINDO O PONTEIRO "P1" PARA "P2". ISSO SIGNIFICA QUE OS DOIS PONTEIROS VÃO ESTAR APONTANDO PARA MESMA VARIÁVEL "X". ENTÃO, QUANDO A GENTE IMPRIMIR.
. . VEJA AQUI, O COMANDO "PRINTF" É PRA IMPRIMIR.
ESSE "%D" EU ESTOU DIZENDO QUE É UM TIPO INTEIRO E AQUI É UM TIPO INTEIRO. QUEM SÃO OS MEUS DOIS TIPOS INTEIROS QUE EU ESTOU IMPRIMINDO? "P1" E "ASTERISCO P2", O CONTEÚDO DE "P1".
ENTÃO, QUANDO EU IMPRIMIR ESSAS DUAS LINHAS, AQUI EU VOU VER QUE OS DOIS PONTEIROS ESTÃO APONTANDO PARA O MESMO VALOR, PARA 8, E PARA O MESMO ENDEREÇO. ENTÃO, O ENDEREÇO QUE ELES APONTAM É O MESMO, E O VALOR QUE ELES APONTAM, O CONTEÚDO VAI SER 8. TÁ BOM?
FAÇAM ISSO, TENTEM FAZER, QUE VAI SER LEGAL BRINCAR COM ISSO. EM RELAÇÃO À ARITMÉTICA DE PONTEIROS, A GENTE TEM BASICAMENTE DUAS OPERAÇÕES: ADIÇÃO, NO SENTIDO DE CAMINHAR COM O INCREMENTO NA MEMÓRIA, E A SUBTRAÇÃO, NO SENTIDO DE RETROCEDER O CAMINHO, CAMINHAR PARA TRÁS, VAMOS DIZER ASSIM, NO INCREMENTO DE MEMÓRIA. ENTÃO, VAMOS LÁ?
ENTÃO, AQUI MAIS UM EXEMPLO PARA VOCÊS. ENTÃO, O MEU PONTEIRO "P" ESTÁ AQUI ALOCADO NESSE ESPAÇO, MAS ELE ESTÁ APONTANDO PARA UMA VARIÁVEL AQUI, PARA UM ESPAÇO 2. 000.
ENTÃO, O "P" APONTA PARA ESSE ESPAÇO DE MEMÓRIA. E AÍ, EU ESTOU DIZENDO QUE ESSE MEU "P", ESTOU PENSANDO QUE AQUI NÓS VAMOS ARMAZENAR INTEIROS DE 2 BYTES, ESSE "P" VAI APONTAR PARA VARIÁVEIS DO TIPO INTEIRO. SE EU FIZER UM "P++", UMA ARITMÉTICA DE INCREMENTO DO "P", O QUE EU VOU FAZER?
EU VOU FAZER O "P", ELE VAI CAMINHAR, ELE VAI CAMINHAR E VAI INCREMENTAR O CONTEÚDO. E O "P--" VAI DECREMENTAR. ENTÃO, COMO QUE EU POSSO FAZER PARA ELE CAMINHAR EU POSSO USAR ESSES INCREMENTOS OU EU POSSO FAZER "P" RECEBE "P" MAIS 2.
AQUI EU TENHO UMA OUTRA ARITMÉTICA, VAMOS LÁ DE NOVO. AGORA AQUI EU ESTOU FALANDO, DEFININDO UM PONTEIRO "P", UMA VARIÁVEL "NUM", QUE TAMBÉM É DO TIPO INTEIRO E JÁ ESTOU ATRIBUINDO 1 A ELA, E "NUM2" EU NÃO ESTOU ATRIBUINDO NADA, QUE TAMBÉM É DO TIPO INTEIRO. AÍ AQUI EU ESTOU DIZENDO: "'P', APONTA PARA 'NUM'".
POR QUÊ? EU ESTOU MANDANDO O ENDEREÇO DE "NUM" PARA "P". ENTÃO, O "P" VAI RECEBER 2.
000. ENTÃO, O "P" ESTÁ APONTANDO PARA "NUM". E "NUM" ESTAVA GUARDANDO, COMO EU ATRIBUÍ, O VALOR DE 1.
AQUI O QUE EU POSSO FAZER? AGORA "NUM", QUE É UMA VARIÁVEL, RECEBE O CONTEÚDO DO PONTEIRO "P", DO VALOR APONTADO POR "P", MAIS 1. QUE VAI SER O QUÊ?
O QUE ESTAVA O VALOR DA VARIÁVEL APONTADA POR "P"? 1. 1 MAIS 1, 2.
ENTÃO, "NUM" VAI FICAR COM O VALOR 2. E AGORA, OLHA AQUI QUE LEGAL! EM "NUM2" EU ESTOU FALANDO PRA ELE: "OH, ME DÁ O CONTEÚDO DO ENDEREÇO DE 'NUM'", QUE TAMBÉM VAI SER 2.
POR QUÊ? O "NUM" NÃO FICOU COM 2? 1 MAIS 1?
E EU VOU PEGAR O VALOR DE "NUM2". ENTÃO, NESSE CASO AÍ, O "NUM" E O "NUM2" VÃO TER VALOR 2 E 2. OUTRA COISA QUE EU POSSO FAZER TAMBÉM EM PONTEIROS É COMPARAÇÃO DE PONTEIROS, A COMPARAÇÃO DO ENDEREÇO PARA ONDE ELES APONTAM.
ENTÃO, A GENTE COMPARA, NA VERDADE, AS POSIÇÕES DE MEMÓRIA. ENTÃO, AQUI, NESSE EXEMPLO, EU ESTOU DEFININDO DOIS PONTEIROS, EU ESTOU DEFININDO O "P1" E ESTOU DEFININDO O "P2", E A VARIÁVEL "X", QUE RECEBE 10. E AÍ, EU ESTOU DIZENDO PARA "P1": "APONTA PARA 'X'".
E ESTOU DIZENDO PARA "P2": "RECEBE O MESMO APONTAMENTO QUE 'P1' FEZ". ENTÃO, OS DOIS VÃO APONTAR PARA "X". NESSE CASO, SE EU FIZER ESSE CONDICIONAL AQUI, MAIS UM PARA VOCÊS, "IF (P1 ==".
. . ENTÃO, O IGUAL AQUI SÃO DOIS IGUAIS, UM IGUAL É ATRIBUIÇÃO.
"IF (P1 == P2)", AÍ PODE FAZER ALGUMA COISA. SIGNIFICA O QUÊ? OS DOIS APONTAM PARA O MESMO ESPAÇO, PARA O MESMO ENDEREÇO DE MEMÓRIA.
OUTRA COISA QUE EU POSSO FAZER É PERGUNTAR "IF (P1)", EU ESTOU PERGUNTANDO SE "P1" APONTA PRA ALGUM LUGAR. . .
É LÓGICO QUE EU TENHO QUE TER INICIALIZADO O "P1" AÍ COM ZERO, PORQUE EU ESTOU PERGUNTANDO SE O PONTEIRO É NULO. ENTÃO, ERA ISSO, PESSOAL, BASICAMENTE DE PONTEIRO ERA O QUE QUERIA MOSTRAR PARA VOCÊS. EU USEI BASTANTE COISAS, ASSIM, DESSES LIVROS.
NA BIBLIOTECA VOCÊS VÃO ENCONTRAR TAMBÉM MAIS INFORMAÇÕES SOBRE A QUESTÃO DE PONTEIROS. TÁ BOM? ENTÃO, COM ESSE CONTEÚDO, EU FINALIZO A PRIMEIRA AULA DA SEMANA CINCO DE SISTEMAS COMPUTACIONAIS.
ESPERO QUE VOCÊS TENHAM APRENDIDO SOBRE PONTEIRO, VÃO TER QUESTÕES BEM INTERESSANTES SE VOCÊS QUISEREM SE APROFUNDAR NA BIBLIOGRAFIA QUE EU DEIXEI PRA VOCÊS DE CONSULTA. OBRIGADA A TODOS E ATÉ A PRÓXIMA AULA!
Copyright © 2024. Made with ♥ in London by YTScribe.com