Vídeo: Pointers and arrays 2024
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];.