Lar Finanças Pessoais Arrays e Ponteiros em C ++ - dummies

Arrays e Ponteiros em C ++ - dummies

Vídeo: Pointers and arrays 2024

Vídeo: Pointers and arrays 2024
Anonim

O nome da matriz é um ponteiro para a matriz em si. A matriz é uma seqüência de variáveis ​​armazenadas na memória. O nome da matriz aponta para o primeiro item.

Esta é uma questão interessante sobre ponteiros: você pode ter um cabeçalho de função, como a seguinte linha, e use tamanho para determinar quantos elementos estão na matriz? Se assim for, esta função não precisaria que o chamador especifique o tamanho da matriz.

int AddUp (int Numbers []) {

Considere esta função encontrada no exemplo Array01 e um main () que o chama:

void ProcessArray (int Numbers []) { cout << "função interna: O tamanho em bytes é" << sizeof (Números) << endl;} int main (int argc, char * argv []) {int MyNumbers [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; cout << "função externa: o tamanho em bytes é"; cout << sizeof (MyNumbers) << endl; ProcessArray (MyNumbers); retornar 0;}

Quando você executa este aplicativo, veja o que vê:

Função externa: Tamanho em bytes é 40 Função interna: O tamanho em bytes é 4

Fora da função, o código sabe que o tamanho da matriz é de 40 bytes. Mas por que o código acha que o tamanho é 4 depois que ele está dentro da matriz? O motivo é que, embora pareça que você está passando uma matriz, você está realmente passando um ponteiro para uma matriz. O tamanho do ponteiro é apenas 4, e assim é o que a linha final do cout imprime.

Declarar arrays tem uma ligeira idiossincrasia. Quando você declara uma matriz fornecendo um número definido de elementos, como

int MyNumbers [5];

o compilador sabe que você possui uma matriz e o tamanho do operador lhe dá o tamanho de toda a matriz. O nome da matriz, então, é ambos um ponteiro e uma matriz! Mas se você declarar um cabeçalho de função sem um tamanho de matriz, como

void ProcessArray (int Numbers []) {

o compilador trata isso como simplesmente um ponteiro e nada mais. Esta última linha é, na verdade, equivalente à seguinte linha:

void ProcessArray (int * Numbers) {

Assim, dentro das funções que qualquer linha declara, as duas linhas de código a seguir são equivalentes <: Números [3] = 10; * (Números + 3) = 10;

Esta equivalência significa que se você usar uma declaração externa em uma matriz, como

extern int MyNumbers [];

e depois pegue o tamanho desta matriz, o compilador ficará confuso. Aqui está um exemplo: se você tiver dois arquivos, números. cpp e principal. cpp, onde números. cpp declara uma matriz e principal. cpp declara externamente (como mostrado no exemplo Array02), você receberá um erro de compilação se você chamar sizeof:

#incluir usando namespace std; extern int MyNumbers []; int main (int argc, char * argv []) {cout << sizeof (MyNumbers) << endl; return 0;}

No código:: Blocks, o compilador gcc nos dá este erro:

erro: aplicação inválida de 'sizeof' para o tipo incompleto 'int []'

A solução é colocar o tamanho da matriz dentro de suportes.Apenas certifique-se de que o tamanho é o mesmo que no outro arquivo de código fonte! Você pode fingir o compilador alterando o número e você

não receberá um erro . Mas isso é um estilo de programação ruim e apenas pede erros. Embora uma matriz

seja simplesmente uma seqüência de variáveis ​​todas adjacentes uma à outra na memória, o nome de uma matriz é realmente apenas um ponteiro para o primeiro elemento na matriz. Você pode usar o nome como ponteiro. No entanto, faça isso somente quando você realmente precisa trabalhar com um ponteiro. Afinal, você realmente não tem motivos para escrever código que seja críptico, como * (Números + 3) = 10;. O inverso também é verdadeiro. Olhe para esta função:

void ProcessArray (int * Numbers) {cout << numbers [1] << endl;}

Esta função leva um ponteiro como um parâmetro, mas você acessá-lo como uma matriz. Novamente, não escreva código como este; Em vez disso, você deve entender

porque o código como esse funciona . Dessa forma, você ganha um conhecimento mais profundo das matrizes e como elas vivem dentro do computador, e esse conhecimento, por sua vez, pode ajudá-lo a escrever o código que funciona corretamente. Mesmo assim, o nome da matriz é apenas um ponteiro, o nome de uma matriz de inteiros não é exatamente o mesmo que um ponteiro para um número inteiro. Confira essas linhas de código (encontrado no exemplo Array03):

int LotsONumbers [50]; int x; LotsONumbers = & x;

Aponte o ponteiro

LotsONumbers para algo diferente: algo declarado como um número inteiro. O compilador não permite que você faça isso; você cometeu um erro. Esse não seria o caso se LotsONumbers fossem declarados como int * LotsONumbers; então esse código funcionaria. Mas, conforme escrito, este código fornece um erro no compilador. E acredite ou não, aqui está o erro do compilador que você obtém Código:: Blocos: erro: tipos incompatíveis na atribuição de 'int *' para 'int [50]'

Este erro implica que o compilador vê uma distinção definida entre os dois tipos, int * e int []. No entanto, o nome da matriz é de fato um ponteiro, e você pode usá-lo como um; Você simplesmente não pode fazer tudo com isso, você pode com um ponteiro normal, como reatribuí-lo.

Ao usar arrays, observe as seguintes dicas. Estes irão ajudá-lo a manter seus arrays sem erros:

Mantenha o código consistente. Se você declarar, por exemplo, um ponteiro para um inteiro, não o trate como uma matriz.

  • Mantenha seu código claro e compreensível. Se você passar ponteiros, é bom tomar o endereço do primeiro elemento, como no & (MyNumbers [0]) se isso tornar o código mais claro - embora seja equivalente apenas a MyNumbers.

  • Quando você declara uma matriz, tente sempre colocar um número dentro dos suportes, a menos que esteja escrevendo uma função que tenha uma matriz.

  • Quando você usa a palavra-chave externa para declarar uma matriz, vá em frente e coloque o tamanho da matriz dentro de suportes. Mas seja consistente! Não use um número uma vez e um número diferente em outra hora. A maneira mais fácil de ser consistente é usar uma constante, como const int ArraySize = 10; em um arquivo de cabeçalho comum e, em seguida, use isso na sua declaração de matriz: int MyArray [ArraySize];.

Arrays e Ponteiros em C ++ - dummies

Escolha dos editores

Filmando fotos em situações especiais com Canon Rebel Série T3 Câmeras - manequins

Filmando fotos em situações especiais com Canon Rebel Série T3 Câmeras - manequins

ÀS vezes haverá não há problema em tirar o seu Canon Rebel T3 ou T3i fora e tirar fotos com configurações automáticas. A maior parte do tempo, você pode fazer com alguns ajustes simples. Alguns assuntos e situações de filmagem apresentam alguns desafios adicionais que exigem combinações de configurações mais complicadas. ...

Escolha dos editores

Obtendo o WordPress. org Software - dummies

Obtendo o WordPress. org Software - dummies

Depois de classificar seu host e domínio do site, você deve baixar e extrair os arquivos do WordPress pela WordPress. org e colocá-los no seu computador. Escolha um lugar que você lembrará, como um diretório de Documentos ou Download. Siga estas etapas: aponte seu navegador para o WordPress. org. A página principal do WordPress aparece. Clique em ...

Google AdSense para Bloggers de Mom - dummies

Google AdSense para Bloggers de Mom - dummies

Google O AdSense não é uma rede de anúncios orientada para a mãe, nem é A melhor opção de publicidade para a maioria dos blogs da mãe. Há certamente exceções a isso, especialmente se você blogar sobre produtos ou marcas. Todos os blogueiros que exibem publicidade devem ter um provedor de anúncios de backup - e o AdSense é uma ótima solução para essa necessidade. AdSense aprova ...

Relatório de conteúdo principal do google Analytics - dummies

Relatório de conteúdo principal do google Analytics - dummies

O relatório Top Content é um dos relatórios mais importantes no Google Analytics. Este relatório mostra as postagens mais populares no blog da sua mãe. Seu conteúdo popular dá uma visão do porquê seus leitores chegam até você. Os tópicos dessas postagens indicam o que as pessoas gostam, mesmo quando não comentam. Para visualizar ...

Escolha dos editores

Como fazer uma imagem disparar um link - as manequins

Como fazer uma imagem disparar um link - as manequins

Usam imagens para navegação . Eles são mais bonitos que os links de texto simples, e você pode adicionar a forma e a função na sua página com um elemento. Para criar uma imagem que desencadeia um link, você substitui um elemento no lugar do texto ao qual você ancoraria seu link. Esta marcação liga o texto: ...

Como abrir links em novos Windows ou Tabs com HTML5 - dummies

Como abrir links em novos Windows ou Tabs com HTML5 - dummies

O A web funciona porque você pode vincular páginas em seu site para páginas nos sites de outras pessoas usando um elemento de âncora simples. Quando você liga para o site de outra pessoa, você envia usuários para longe de seu próprio site. Para manter os usuários no seu site, HTML pode abrir a página vinculada em uma nova janela ...

Como criar tabelas em HTML5 - dummies

Como criar tabelas em HTML5 - dummies

O recipiente de marcação primária para tabelas em HTML é a tabela elemento. Ou seja, você usa a tag de abertura para denotar o início de uma tabela e você adiciona a tag de fechamento para encerrá-la. Além disso, os blocos de construção básicos para dados de tabela em HTML são a linha da tabela ( ) e os dados da tabela ...