Operador Estranho em C

Programação C em geral

Moderadores: 51, guest2003

Operador Estranho em C

Mensagempor Cefas » 29 Mar 2013 00:31

Olá Pessoal!

Baixei um código-fonte da internet e me deparei com um operador que eu nunca tinha visto...

->


No código esta assim:

SYSCTL -> RCGC2 |= 0xFF;

Alguém poderia me explicar o por que?

Att.
Cefas
Nibble
 
Mensagens: 58
Registrado em: 26 Dez 2011 19:47

Re: Operador Estranho em C

Mensagempor Rodrigo_P_A » 29 Mar 2013 00:36

Cefas escreveu:Olá Pessoal!

Baixei um código-fonte da internet e me deparei com um operador que eu nunca tinha visto...

->


No código esta assim:

SYSCTL -> RCGC2 |= 0xFF;

Alguém poderia me explicar o por que?

Att.


é uma estrutura referenciada através de um ponteiro, deve ser algo do tipo:

typedef struct {
int RCGC2;
} tp1;


int main()
{
tp1 estrutura;
tp1 *SYSCTL;

SYSCTL=&estrutura; // o SYSCTL é um ponteiro do tipo da estrutura q aponta para algum endereço qquer ou foi alocado dinamicamente, por isso eu ADORO linguagem C!!!!!!!

SYSCTL->RCGC2 |=0xFF; // agora vc acessou o membro RCGC2 da estrutura

isso seria equivalente a acessar um dado de um ponteiro usando *

}
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Operador Estranho em C

Mensagempor RobL » 30 Mar 2013 12:04

O Rodrigo_P_A não é somente Dr em C como detem a prática do C, assim como também é Dr em colocar o Forum asm51 em perfeito estado.
Como foi surpresa esse código com a seta, e estou cheio de tarefas, mas cansado, vou tentar ir um pouco para trás, pois sou eterno aprendiz em C e vivo me acidentando com ponteiros.

Como você sabe, uma struct é um tipo complexo de dados.
Diferente de um Vetor (matriz) que só tem um tipo de dado, por exemplo, somente inteiro, somente char, etc, uma struct pode conter todos os tipos de dados definidos em C. Um exemplo clássico nos livros é um cadastro de cliente, ou em microP um grupo de registros de uma Uart, do timer, etc. A vantagem é que ficarão agrupados em uma região da memória. Nenhuma outra variável, que você definir posteriormente, vai entrar no meio deles, estragando a sequencia dos seus membros.
Numa matriz, todos os membros são de um só tipo. Os dados ficarão agrupados e sequencialmente arrumados na memoria. Por exemplo um char sem sinal, ficará um byte após o outro. Você acessa cada byte usando o indice da matriz.
No caso da struct, os seus membros tem tipos diferentes, "tamanhos diferentes". Uma struct é uma "caixa" onde você guarda vários tipos de dados agrupados numa região da memo, por que isto lhe interessa naquele grupo de variáveis.
Exemplo: uma estrutura com 3 membros, um unsigned char, int, uint32_t cada um com um nome da variável:
typedef struct
{
char baite;
int inteiro;
uint32_t bits32 ;
} tipo_struct ;

Acima nossa "caixa " com as 3 variáveis guardadas dentro.
Vamos definir um tipo do mesmo tipo dessa struct, com o nome UmNome.
tipo_struct UmNome ; //UmNome é uma struct do tipo tipo_struct com 3 membros.

Vamos acessar um membro, o membro baite e fazer a operação OR do seu exemplo:

UmNome.baite |= 0xFF ; // o membro(variável) baite da estrutura de UmNome ficou com todos seus bits setados.
Note o ponto (intervalo) e não a seta entre eles.
Vamos fazer o mesmo com a seta:
tipo_struct *ptr ; // ptr é um ponteiro do tipo tipo_struct
Agora vamos apontar esse ponteiro para a struct UmNome:
ptr = UmNome ;
Vamos fazer a mesma operação acima com esse ponteiro para o membro baite:
ptr -> baite |= 0xFF ;//o membro(variável)de nome baite da estrutura UmNome, ficou com todos seus bits setados.
Quando se usa ponteiros para acessar um membro de uma struct em vez do ponto, usa-se a seta -> .

Passível de erro. Verificar.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Re: Operador Estranho em C

Mensagempor Rodrigo_P_A » 30 Mar 2013 12:15

RobL escreveu:O Rodrigo_P_A não é somente Dr em C como detem a prática do C, assim como também é Dr em colocar o Forum asm51 em perfeito estado.
Como foi surpresa esse código com a seta, e estou cheio de tarefas, mas cansado, vou tentar ir um pouco para trás, pois sou eterno aprendiz em C e vivo me acidentando com ponteiros.

Como você sabe, uma struct é um tipo complexo de dados.
Diferente de um Vetor (matriz) que só tem um tipo de dado, por exemplo, somente inteiro, somente char, etc, uma struct pode conter todos os tipos de dados definidos em C. Um exemplo clássico nos livros é um cadastro de cliente, ou em microP um grupo de registros de uma Uart, do timer, etc. A vantagem é que ficarão agrupados em uma região da memória. Nenhuma outra variável, que você definir posteriormente, vai entrar no meio deles, estragando a sequencia dos seus membros.
Numa matriz, todos os membros são de um só tipo. Os dados ficarão agrupados e sequencialmente arrumados na memoria. Por exemplo um char sem sinal, ficará um byte após o outro. Você acessa cada byte usando o indice da matriz.
No caso da struct, os seus membros tem tipos diferentes, "tamanhos diferentes". Uma struct é uma "caixa" onde você guarda vários tipos de dados agrupados numa região da memo, por que isto lhe interessa naquele grupo de variáveis.
Exemplo: uma estrutura com 3 membros, um unsigned char, int, uint32_t cada um com um nome da variável:
typedef struct
{
char baite;
int inteiro;
uint32_t bits32 ;
} tipo_struct ;

Acima nossa "caixa " com as 3 variáveis guardadas dentro.
Vamos definir um tipo do mesmo tipo dessa struct, com o nome UmNome.
tipo_struct UmNome ; //UmNome é uma struct do tipo tipo_struct com 3 membros.

Vamos acessar um membro, o membro baite e fazer a operação OR do seu exemplo:

UmNome.baite |= 0xFF ; // o membro(variável) baite da estrutura de UmNome ficou com todos seus bits setados.
Note o ponto (intervalo) e não a seta entre eles.
Vamos fazer o mesmo com a seta:
tipo_struct *ptr ; // ptr é um ponteiro do tipo tipo_struct
Agora vamos apontar esse ponteiro para a struct UmNome:
ptr = UmNome ;
Vamos fazer a mesma operação acima com esse ponteiro para o membro baite:
ptr -> baite |= 0xFF ;//o membro(variável)de nome baite da estrutura UmNome, ficou com todos seus bits setados.
Quando se usa ponteiros para acessar um membro de uma struct em vez do ponto, usa-se a seta -> .

Passível de erro. Verificar.


Obrigado pelo elogio cara, e parabéns pela tua explicação, acho que clareou mais ainda o Cefas.!
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Operador Estranho em C

Mensagempor bzero » 13 Mai 2013 15:53

esse operador é um facilitador, o código fica ate mais legível ( ao menos pra mim ), em baixo nível ptr->method() é convertido para (*ptr).method()

[]s
bzero
bzero
Bit
 
Mensagens: 5
Registrado em: 02 Abr 2007 15:22


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x