Matrizes e ponteiros em c ++

O nome da matriz é um ponteiro para a própria matriz. o ordem

é uma sequê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 usar apenas tamanho de para determinar quantos elementos estão na matriz? Se assim for, esta função não precisaria ter o chamador especificar o tamanho da matriz.

int addup (Números int []) {

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

ProcessArray anular (Números int []) {cout lt; lt; "Dentro função: Tamanho em bytes é "lt; lt; sizeof (Números) lt; lt; endl-} int principal (int argc, char * argv []) {int MyNumbers [] = {} 1,2,3,4,5,6,7,8,9,10 -cout lt; lt; "função fora: Tamanho em bytes é "-cout lt; lt; sizeof (MyNumbers) lt; lt; endl-ProcessArray (MyNumbers) -Retornar 0-}

Quando você executar este aplicativo, aqui está o que você vê:

função fora: Tamanho em bytes é função 40Inside: 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 pensar que o tamanho é de 4 depois que está dentro da matriz? A razão é que mesmo que parece que você está passando um array, você está realmente passando por uma apontador de uma matriz. O tamanho do ponteiro é apenas 4, e é isso que a final cout impressões de linha.

Declarando matrizes tem um ligeiro idiosyncrasy. Quando você declarar uma matriz, dando um número definido de elementos, tais como

MyNumbers int [5] -

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

ProcessArray anular (Números int []) {

o compilador trata isso como uma simples apontador e nada mais. Esta última linha é, na verdade, equivalente ao seguinte linha:

ProcessArray anular (Números int *) {

Deste modo, dentro das funções que qualquer linha declara, as duas linhas de código seguintes são equivalente:

Números [3] = 10 * - (Números + 3) = 10-

Esta equivalência significa que se você usar um extern declaração sobre uma matriz, tal como

Video: Curso Básico de C/C++: Aula 5 - Vetores, matrizes e structs

MyNumbers extern int [] -


e em seguida, tomar o tamanho desta matriz, o compilador vai ficar confuso. Aqui está um exemplo: Se você tem dois arquivos, numbers.cpp e main.cpp, Onde numbers.cpp declara uma matriz e main.cpp declara que externamente (como mostrado na Array02 exemplo), você receberá um erro do compilador se você chamar tamanho de:

#incluir usando espaço de nomes MyNumbers int std-extern [] - int principal (int argc, char * argv []) {cout lt; lt; sizeof (MyNumbers) lt; lt; endl-retorno 0-}

No Code :: Blocks, o compilador GCC nos dá este erro:

Video: Multiplicação de Matrizes em Linguagem C

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

A solução é colocar o tamanho da matriz dentro de parênteses. Apenas certifique-se de que o tamanho é o mesmo que em outro arquivo de código fonte! Você pode fingir o compilador alterando o número, e você não receberá um erro. Mas isso é estilo de programação ruim e apenas pedindo para erros.

embora um ordem é simplesmente uma sequência de variáveis ​​todos adjacentes uns aos outros na memória, o nome de uma matriz é realmente apenas um ponteiro para o primeiro elemento na matriz. Você pode usar o nome como um ponteiro. No entanto, fazer isso apenas quando você realmente precisa trabalhar com um ponteiro. Afinal, você realmente não tem nenhuma razão para escrever código que é enigmática, como * (Números + 3) = 10-.

O inverso também é verdadeiro. Olhe para esta função:

ProcessArray anular (int * Números) {cout lt; lt; Números [1] lt; lt; endl-}

Esta função recebe um ponteiro como um parâmetro, mas você acessá-lo como uma matriz. Novamente, não escrever código como this- em vez disso, você deve entender por que um código como este funciona. Dessa forma, você obter um conhecimento mais profundo de matrizes e como eles vivem dentro do computador, e esse conhecimento, por sua vez, pode ajudar a escrever código que funcione corretamente.

Mesmo assim, o nome da matriz é apenas um ponteiro, o nome de um array de inteiros não é exatamente a mesma coisa como um ponteiro para um inteiro. Confira essas linhas de código (encontrada no Array03 exemplo):

int LotsONumbers [50] -int x-LotsONumbers = &X-

aponte o LotsONumbersapontador a algo diferente: algo declarado como um inteiro. O compilador não deixa você this- você receber um erro. Isso não seria o caso se LotsONumbers foram declaradas como int * LotsONumbers- em seguida, este código iria funcionar. Mas como está escrito, este código dá-lhe um erro do compilador. E, acredite ou não, aqui está o erro do compilador que você entrar em Code :: Blocks:

erro: tipos incompatíveis na atribuição de `int *` para `int [50]`

Esse erro implica o compilador vê uma distinção clara entre os dois tipos, int * e int []. No entanto, o nome da matriz é realmente um ponteiro, e você pode usá-lo como um- você simplesmente não pode fazer tudo com ele que você pode com um ponteiro normal, tais como atribuí-la novamente.

Ao usar matrizes, em seguida, observe as seguintes dicas. Estes irão ajudá-lo a manter suas matrizes livre de bugs:

  • Mantenha o seu código consistente. Se você declarar, por exemplo, um ponteiro para um inteiro, não tratá-lo como uma matriz.

  • Mantenha o seu código claro e compreensível. Se você passar ponteiros, não há problema em tomar o endereço do primeiro elemento, como em &(MyNumbers [0]) Se isso torna o código mais claro - mas é equivalente a pouco MyNumbers.

  • Quando você declarar uma matriz, tente sempre colocar um número entre parênteses, a menos que você está escrevendo uma função que recebe um array.

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


Publicações relacionadas