2016-02-22 6 views
8

Stavo programmando un codice in C++ quando ho inserito accidentalmente parentesi sul mio puntatore e l'uscita del mio programma è cambiata.Quali sono le differenze tra questi tipi di puntatori?

Dato che io sono nuovo di programmazione Volevo sapere la differenza tra questo tipo di puntatori:

int* A[n]; 
int (*A)[n]; 
int *(A[n]); 

Ho letto nel mio libro di testo che gli array sono anche un tipo di puntatori.

+1

Gli array possono * decadere * su un puntatore al loro primo elemento, ma non è un puntatore. Ad esempio, quando si passa una matrice a una funzione o si utilizza l'aritmetica del puntatore, questo decadimento si verifica. –

+1

@JoachimPileborg Quando si passa un array a una funzione * il cui parametro è un puntatore *. In pratica si utilizza il nome di un array per inizializzarlo o assegnarlo a un puntatore che lo fa, non passando a una funzione. – juanchopanza

+0

impara la regola della spirale in senso orario e non sarai mai più confuso riguardo alle dichiarazioni complesse. http: // StackOverflow.it/a/31789222/3758484 – johnbakers

risposta

15
int* A[n]; 

Una prima è una matrice, indipendentemente dal tipo di elemento. Dopo aver applicato il puntatore *, sappiamo che A è una matrice di puntatori int.

int (*A)[n]; 

Applicando le parentesi, il puntatore * ha precedenza più alta sull'array [] in questo caso. Quindi A è prima di tutto un puntatore indipendentemente da ciò a cui punta. Dopo aver applicato l'array [], sappiamo che A è un puntatore a un array di int.

int *(A[n]); 

Staffe non cambieranno alcun ordine di precedenza che potrebbero influenzare l'array [], quindi parentesi rimozione sarebbero yeild int* A[n] stesso del vostro primo caso.

Are array pointers? 

No. Array è un datastructure che alloca pool di memoria e memorizza i dati sequenzialmente dove come Pointer punti ad un determinato indice di pool di memoria ei riferimenti i dati memorizzati in tale posizione di memoria.

+0

Speking tecnicamente, array * sono * puntatori in C. – Shark

+14

@Shark No, gli array possono * decadere * ai puntatori al loro primo elemento, ma un array non è esso stesso un puntatore. –

+4

@Shark 'sizeof' chiederebbe di differire. – juanchopanza

2

In questo articolo sono buoni esempi di dichiarazioni di tipo di lettura in C. http://www.unixwiz.net/techtips/reading-cdecl.html

In sostanza, è possibile leggere tipi secondo il seguente ordine di precedenza:

  1. (spesso tra parentesi) Inner-tipo più

  2. più a destra (per lo più tipi tipi di array: [])

  3. più a sinistra i tipi, ad eccezione dei più esterno uno (tipi Per lo più puntatore: *)

  4. più esterno tipi (tipi Per lo più primitivi: int, char ..)

Per esempio, la i tipi che hai presentato possono essere letti come segue:

int* A[n]; // An array ([n]) of pointer (*) of int. 
int (*A)[n]; // A pointer (*) of array ([n]) of int. 
int *(A[n]); // An array ([n]) of pointer (*) of int. 

Quindi, fondamentalmente, il primo e il terzo tipo sono identici.