2016-01-30 17 views
6

uczę o wskaźniki:Wskaźniki do tablic 2D C, C++

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

byłoby to zrobić typ wskaźnika int do pierwszego elementu. Tak więc, gdybym miał tablicę 2D, potrzebowałbym użyć podwójnego wskaźnika: pierwszy wskaźnik wskazywałby na drugi wymiar tablicy. To znaczy:

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

i kiedy chcę wskazać to, muszę zadeklarować rozmiar drugiego wymiaru w ten sposób, prawda?

int *p[4] = x; 

lub istnieje inny sposób, wpisując: int **p; ?

i int *p[4] to tablica liczb całkowitych, która zajmuje 4 * (sizeof(int*)), prawda?

+1

Pomyślnie: staraj się unikać wskaźników w C++. Użyj 'std :: vector' lub' std :: array' zamiast macierzy w stylu C. – xtofl

+0

"_'int * p [4]' jest tablicą wskaźników całkowitych, która przyjmuje "4 * (sizeof (int *))", right? _ "- Yes. I ** zawsze ** kompiluje się z włączonymi ostrzeżeniami ('-Wall -Wextra'). Gdy skompilujesz kod, zauważysz ostrzeżenia o niekompatybilnych wskaźnikach. W ten sposób da ci wskazówkę, że coś jest nie tak. –

+0

dobrze .. mingw32-g ++. Exe -o ............................ Proces zakończony ze stanem 0 (0 minut, 0 sekund) 0 błędów, 0 ostrzeżeń (0 minut, 0 sekund) i: 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 ("\ n rozmiar z * p jest:% d \ n", sizeof (p)); ------------------------------------------------- ------------- output: rozmiar * p to: 4 –

Odpowiedz

8

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

nr
&x jest adresem tablicy x i jest typu int (*)[10] i nie można przypisać go do typu int *. Oba typy są niekompatybilne.

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

nr
W wyrażeniach tablice przekształca się wskaźnik do pierwszych elementów wyjątkiem sytuacji, gdy operand sizeof i jednoskładnikową & operatora. Dlatego w tym przypadku typ x będzie po konwersji po int (*)[4]. Potrzebny jest wskaźnik do tablicy 4 int zamiast tablicy 4 wskaźniki

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

, tak, tak, że wskaźnik wskazuje na liczbę całkowitą .. która jest pierwszym elementem tablicy x .. i moje pytanie jest naprawdę takie: int (* p) [4] = x; jest to ^^^ 4 wskaźniki (tablica wskaźników) lub 1 wskaźnik? –

+0

'in * p [4] 'deklaruje tablicę * 4 wskaźników *. 'p' jest tutaj tablicą. – haccks

+0

to dlaczego sizeof (p) to 4? powinno być 16 .. –

3

Aby dodać pierwszy przykład nie jest poprawna.

x to tablica złożona z 10 elementów. p to wskaźnik do int, a nie wskaźnik do tablicy o wartości 10 znaków. Po przypisaniu do p, x rozpada się na wskaźnik typu na int.

Przyporządkowanie powinny być po prostu:

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 | error: nie można przekonwertować 'int (*) [2] [4]' na 'int (*) [0]' podczas inicjowania | –

1

Przykładowy program:

#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)); 
} 

wyjściowy

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

W moim systemie (jak w twoim) int i wskaźniki są 32-bitowe. Tak więc rozmiar wskaźnika wynosi 4, a rozmiar int równy jest 4.

p jest przede wszystkim wskaźnikiem. Nie tablica. Wskaźnik. Jego rozmiar to 4 nie mniej, nie więcej.To odpowiedź na swoje pytanie

Teraz wystarczy dodać kilka przydatnych informacji:

p jest wskaźnikiem do tablicy 4 liczb całkowitych. Rozmiar tego, na co wskazuje p, to 4 * 4 == 16. (Spróbuj zmienić int do short w programie przykładowym, musisz sizeof(*p) is : 8)

mogę przypisać p=x ponieważ typ jest prawidłowy, teraz p zawiera adres xi p [0] jest taki sam jak x [ 0] (ta sama tablica z 4 int). p[2][3] jest taki sam jak x[2][3] i *(p[2]+3). p[2] punktów do elementu 2 xi p[2]+3 punktów do elementu 3 z x[2]. (wszystkie indeksowanie oparte jest na 0)