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

Arrays e Ponteiros em C ++ - dummies

Vídeo: Pointers and arrays 2025

Vídeo: Pointers and arrays 2025
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

Como executar o teste beta para uma aplicação iOS - manequins

Como executar o teste beta para uma aplicação iOS - manequins

Depois de executar o seu aplicativo em alguns dispositivos e está confiante de que está funcionando da maneira que é suposto, considere levá-lo às mãos de alguns testadores beta. O teste beta permite que você receba comentários de usuários reais e repare todos os erros antes que o público em geral os veja. Você pode se surpreender ...

Como publicar no Amazon Appstore para Android - dummies

Como publicar no Amazon Appstore para Android - dummies

Publicação para o Amazon Appstore para Android é semelhante à publicação na Google Play Store: você cria uma conta e, em seguida, talvez seja necessário pagar uma taxa de desenvolvedor. Ao contrário do Google Play Store, os aplicativos devem ser revistos no Amazon Appstore para Android, portanto, planeje alguns dias entre o dia em que você enviar ...

Como preparar ativos gráficos em seu aplicativo Android para publicar na Play Store - Dummies

Como preparar ativos gráficos em seu aplicativo Android para publicar na Play Store - Dummies

Quando você publica um aplicativo Android na Play Store, você interage com o Console do desenvolvedor do Google Play. O passo essencial nesta interação é o passo em que você carrega o arquivo APK do seu aplicativo. É o passo essencial, mas não é o único passo. Você também deve usar a Consola do desenvolvedor da Play Store ...

Escolha dos editores

As Leis de Minecraft Redstone - dummies

As Leis de Minecraft Redstone - dummies

Cada mecanismo Redstone da Minecraft possui um conjunto diferente de propriedades que determinam como ele atua. Você deve entender as relações entre suas propriedades. Depois de trabalhar com Redstone por um tempo, a forma e a função das suas ferramentas podem se tornar bastante intuitivas. Até então, você pode usar essas informações para descobrir quais opções são ...

Minecraft Pocket Edition Guia de Sobrevivência - dummies

Minecraft Pocket Edition Guia de Sobrevivência - dummies

Ao contrário da versão bastante complicada para PC do Minecraft, Pocket Edition (PE) de A Minecraft tem uma série de etapas mais direta para alcançar seu ponto final, o Nether Spire. Para sobreviver ao PE Minecraft, um jogador precisa seguir a série de passos descritos abaixo. Punch madeira e construir um abrigo. Todo o Minecraft ...

Minecraft Para Dummies Cheat Sheet - dummies

Minecraft Para Dummies Cheat Sheet - dummies

Minecraft requer um jogador para reunir recursos para sobreviver, construir, criar, e avance no jogo. Devido aos diferentes ambientes encontrados no Minecraft, um jogador precisa usar diferentes estratégias para reunir recursos eficientemente nas três principais áreas do jogo - Overland, the Mines e the Nether. Uma vez que estes ...

Escolha dos editores

Como criar mensagens de e-mail de impressão em série no Word 2013 - dummies

Como criar mensagens de e-mail de impressão em série no Word 2013 - dummies

Palavra 2013 permite que você expire mensagens de e-mail personalizadas usando a opção E-Mail para mala direta. Esta opção funciona apenas quando você configura o programa Microsoft Outlook no seu computador. Depois disso, você inicia o documento principal para sua fusão de e-mail obedecendo a estas etapas:

Como criar múltiplas colunas em um documento do Word 2007 - dummies

Como criar múltiplas colunas em um documento do Word 2007 - dummies

Para converter seu padrão single- (ou não-) coluna do documento do Word 2007 em um com várias colunas, basta escolher o formato da coluna que deseja no menu Colunas. Instantaneamente, seu documento é transformado em uma maravilha multicolora!

Como criar tabelas rápidas nas tabelas do Word 2008 para Mac - dummies

Como criar tabelas rápidas nas tabelas do Word 2008 para Mac - dummies

Ajudam você a organizar idéias ou dados que seriam aborrecedores e difíceis de compreender em forma de parágrafo regular. Com o Word 2008 para Mac, você pode facilmente criar tabelas - às vezes chamadas de grades - em qualquer lugar em seus documentos. A maneira mais fácil de criar tabelas é com um dos melhores recursos novos ...