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 for assim, esta função não necessita de ter o chamador especificar o tamanho da matriz.
int addup (Números int []) {
Considere esta função encontrada na Array01 e um exemplo a Principal() que chama-lo:
anular ProcessArray (Números int []) {cout lt; lt; "Função Interior: Tamanho em bytes é" lt; lt; sizeof (Numbers) lt; lt; endl-} int main (int argc, char * argv []) {int MyNumbers [] = {} 1,2,3,4,5,6,7,8,9,10 -cout lt; lt; "Função Exterior: 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 de pensar que o tamanho é de 4 depois que está dentro da matriz? A razão é que mesmo que parece que você está passando uma matriz, você está realmente passando por uma apontador de uma matriz. O tamanho do ponteiro está apenas a 4, e é isso que a final cout linha é impressa.
Declarar arrays tem um ligeiro idiossincrasia. 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, eo tamanho de operador dá-lhe 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, tais como
anular ProcessArray (Números int []) {
o compilador trata isso como uma simples apontador e nada mais. Esta última linha é, na verdade, equivalente ao seguinte linha:
anular ProcessArray (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, tais como
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:
#incluirusing namespace MyNumbers int STD-extern [] - int main (int argc, char * argv []) {cout lt; lt; sizeof (MyNumbers) lt; lt; endl-retorno 0-}
No Code :: Blocks, o compilador GCC nos dá este erro:
erro: aplicação inválida de "sizeof" para tipo incompleto 'int []'
A solução é colocar o tamanho da matriz dentro de parênteses. Apenas se certificar de que o tamanho é o mesmo que no outro ficheiro de código de 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:
anular ProcessArray (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 compreender 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 número 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 permite que 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, tal como atribuí-lo novamente.
Ao usar matrizes e, 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 clara 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, sempre tento 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 coerente! 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, tal 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] -.