2016-01-30 14 views
6

sto imparando circa puntatori:Puntatori a 2D array C, C++

int x[10]; 
int *p = &x 

Questo sarebbe un tipo di puntatore int al primo elemento. Quindi, se avessi un array 2D, ho bisogno di usare un doppio puntatore: il primo puntatore punta alla seconda dimensione dell'array. Ciò significa:

int x[3][4] = {{1,2,3,4},{5,6,7,8},{9,9,9,9}}; 

e quando voglio puntare ad esso devo dichiarare la dimensione della seconda dimensione come questo, giusto?

int *p[4] = x; 

o c'è un altro modo digitando: int **p; ?

e int *p[4] è una matrice di puntatori interi che prende 4 * (sizeof(int*)), giusto?

+1

Solo a parte: prova a evitare tutti i puntatori del tutto in C++. Usa 'std :: vector' o' std :: array' invece di matrici in stile C. – xtofl

+0

"_'int * p [4]' è una matrice di puntatori interi che accetta '4 * (sizeof (int *))', giusto? _ "- Sì. E ** sempre ** compilare con avvisi abilitati ('-Wall -Wextra'). Noterai quindi gli avvertimenti sui tipi di puntatori incompatibili durante la compilazione del codice. Quindi ti darà un'indicazione che qualcosa non va. –

+0

well .. mingw32-g ++. Exe -o ............................ Processo terminato con stato 0 (0 minuti, 0 secondi) 0 errori, 0 Ammonizioni (0 minuti, 0 secondi) e: int x [3] [4] = {{1,2,3,4}, {5,6,7,8 }, {9,987,9,9}}; int (* p) [4] = x; printf ("% d", p [2] [1]); printf ("\ nsize di * p is:% d \ n", sizeof (p)); ------------------------------------------------- ------------- output: dimensioni di * p è: 4 –

risposta

8

this would make a pointer type (int) to first element ..

No.
&x è l'indirizzo della matrice x ed è di tipo int (*)[10] e non è possibile assegnare a un tipo int *. Entrambi sono tipi incompatibili.

So, if I had 2D array, I need to use double pointer: first pointer would point to the second dimension of the array.

No.
Nelle espressioni, matrici convertito puntatore al suo primi elementi tranne quando un operando di sizeof e unario & operatore. Pertanto, in questo caso il tipo di x sarà int (*)[4] dopo la conversione. Avete bisogno di un puntatore a un array di 4 int invece di un array di 4 puntatori

int (*p)[4] = x; 
+0

bene, sì .. il puntatore punta a un intero .. che è il primo elemento dell'array x .. e la mia domanda è proprio questa: int (* p) [4] = x; è questo ^^^ 4 puntatori (matrice di puntatori) o 1 puntatore? –

+0

'in * p [4]' dichiara un array di * 4 puntatori *. 'p' è un array qui. – haccks

+0

allora perché sizeof (p) è 4? dovrebbe essere 16 .. –

3

Per aggiungere, il primo esempio non è corretto.

x è un array di 10 pollici. p è un puntatore a int e non un puntatore a un array di 10 ints. Se assegnato a p, decadimenti x al puntatore di tipo su int.

L'assegnazione dovrebbe essere semplicemente:

int* p = x; 
-2
// Here is not complicated matrix of size 
int p[2][4]={ 
       {1,2,3,4}, 
       {5,6,7,8} 
      }; 
// points to the first Elements :: ptr 
int (*ptr)[0] = &p; 
// Now have the same adresse (ptr and p) 
printf("Hello world! %d \n",ptr[1][3]); // show 4 
+2

Untitled1.cpp | 35 | errore: impossibile convertire 'int (*) [2] [4]' in 'int (*) [0]' nell'inizializzazione | –

1

programma Esempio:

#include <stdio.h> 
main(int argc, char* argv[]) 
{ 
    int x[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 987, 9, 9 } }; 
    int(*p)[4] = x; printf("p[2][1] %d", p[2][1]); 
    printf("\nsizeof(p) is : %d \nsizeof(*p) is : %d\n", sizeof(p), sizeof(*p)); 
} 

uscita

p[2][1] 987 
sizeof(p) is : 4 
sizeof(*p) is : 16 

Nel mio sistema (come nel tuo) int e i puntatori sono 32 bit. Quindi la dimensione di un puntatore è 4 e anche la dimensione di un int è 4.

p è innanzitutto un puntatore. Non un array. Un puntatore Le sue dimensioni non sono più né 4 né meno.Questa è la risposta alla tua domanda

Ora, solo per aggiungere alcune informazioni utili:

p è un puntatore a un array di 4 interi. La dimensione di ciò che indica p è 4 * 4 == 16. (Provare a cambiare int al short nel programma di esempio, avrete sizeof(*p) is : 8)

posso assegnare p=x perché il tipo è corretto, ora p contiene l'indirizzo di x e p [0] è lo stesso di x [ 0] (lo stesso array di 4 int). p[2][3] corrisponde a x[2][3] e *(p[2]+3). p[2] punti per l'elemento 2 di xe p[2]+3 punti per l'elemento 3 di x[2]. (tutta l'indicizzazione è basata su 0)