Właśnie zacząłem uczyć się programowania w C i aby lepiej zrozumieć wskaźniki i tablice, próbowałem odwoływać się do elementów tablicy bez tworzenia żadnego wskaźnika:
for(k1 = 0; k1 < ROW; k1++){
for(k2 = 0; k2 < COLUMN; k2++){
array[k1][k2] = k1*COLUMN + k2 + 1;
printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));
}
}
Cały kod kompiluje się i działa bezbłędnie.
Wyobrażam sobie, że tworzenie wskaźnika dla każdej tablicy w dużym kodzie źródłowym wydaje się wysoce nieefektywne.
Czy więc zamiast posiadania adresu tablicy zapisanego i pobranego za pomocą wskaźnika, złą praktyką programistyczną jest bezpośrednie używanie adresu tablicy, jak pokazano powyżej?
programming-practices
c
Niko Gambt
źródło
źródło
printf "[%d][%d] = %d\n", k1, k2, array[k1] [k2]));
pozwoliłoby uniknąć arytmetyki wskaźnika i jest łatwiejsze do zrozumienia.Odpowiedzi:
Jest „zły” tylko w takim stopniu, w jakim jest mniej czytelny.
a[x]
to to samo, co*(a+x)
, więc nie ma różnicy w wydajności lub zachowaniu (w rzeczywistościx[a]
będzie działać). Po prostua[x]
jest to dla nas, ludzi, o wiele bardziej intuicyjne.Ale to nie znaczy, że czytelność nie jest wielkim problemem. Aby zobaczyć, jak duży, zastanów się, jak „odczytałbyś” te dwa wyrażenia, jeśli zobaczysz je w kodzie:
*(a+x)
= "Rzecz wskazana przez sumę wskaźnikaa
i liczby całkowitejx
"a[x]
= "Thex
th członek tablicya
"Podobnie, gdy trzeba odwołać się do adresu elementu tablicy:
(a+x)
= "Suma wskaźnikaa
i liczby całkowitejx
"&a[x]
= "Adresx
th członka tablicya
"W większości przypadków
[]
wersje są po prostu łatwiejsze do zrozumienia, gdy patrzysz na nietrywialny kod działający na kilku różnych tablicach (zwłaszcza tablicach). Właśnie dlatego[]
operator istnieje.PS Robienie tego rodzaju rzeczy wyłącznie jako ćwiczenia edukacyjne jest bardzo dobrym pomysłem. Ważne jest, aby zrozumieć, że tablice są tak naprawdę wskaźnikami i przesunięciami.
źródło
Tak, to zła praktyka, ale nie z powodów nieefektywności.
Operator macierzy używa arytmetycznej wskazówki pod maską, dzięki czemu są one równie wydajne.
Problem z arytmetyką wskaźnika polega na tym, że jest on bardzo podatny na błędy i trudniejszy do odczytania.
Ogólna zasada: nie używaj arytmetyki wskaźnika, chyba że musisz.
źródło
Ochłódź naukę c, właśnie odkryłeś jedną z c małych łamigłówek. Nie wykonujesz arytmetyki wskaźników na tablicy, ale tablicę wskaźników. Wykonywanie arytmetyki wskaźnika na tablicach nie jest możliwe. Tablica rozpada się na wskaźnik, ale sama nie jest wskaźnikiem. To, co masz (patrz komentarz cmastera), to
Dereferencja tego wskaźnika daje wartość, którą wskazuje właśnie obliczony wskaźnik. Generalnie nie ma sensu robić tego, co robisz. Ale możesz linearyzować tablicę, a następnie krok w nią, tak jak to.
Krok jej to x_dim. Mam nadzieję, że moja odpowiedź jest wyjaśniona!
źródło
int* array[ROW];
anint array[ROW][COLUMN];
, czy anint (*array)[COLUMN];
. Każda z tych trzech definicji może być używana z kodem w PO.