Jak możesz sprawdzić ten kod:
#include<stdio.h>
int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[0][i]=12-i;
printf("a[0][%i] = %in", i, a[0][i]);
}
return 0;
}
Prawidłowo drukuje liczbę od 12 do 1. Jednak ten fragment kodu:
#include<stdio.h>
int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[i][0]=12-i;
printf("a[%i][0] = %in", i, a[i][0]);
}
return 0;
}
Drukuje 12, 11, 10, 1, 2, 1. Jaki może być problem? Wiem, że możesz to wydrukować za pomocą 2 pętli i zmiennych, ale staram się nauczyć, jak to zrobić.
Odpowiedzi:
3 dla odpowiedzi № 1To, co tam robisz, jest złą praktyką w obu przypadkach. Masz szczęście, że działa pierwszy sposób (ponieważ 3 podrzędne tablice o rozmiarze 4 są w pamięci kolejne).
Jeśli chcesz pracować z tablicami dwuwymiarowymi w jednowymiarowej pętli, powinieneś użyć dwóch sposobów podziału liczb całkowitych: /
i %
:
int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[i/4][i%4]=12-i;
printf("a[%i][%i] = %in", i/4, i%4, a[i/4][i%4]);
}
return 0;
}
Na przykład dla i = 7
, mamy i/4 == 1
(„podziel i zaokrąglij w dół do liczby całkowitej”) i i%4 == 3
(„reszta po podziale”).
0 dla odpowiedzi nr 2
Ma to związek ze sposobem przechowywania danychpamięć. W pierwszym przypadku dodajesz je sekwencyjnie i ma miejsce na 3 * 4 = 12 elementów. Możesz więc na szczęście włożyć wszystkie elementy do środka, ponieważ masz w sumie 3 * 4 komórki. W drugim przypadku próbujesz umieścić dane tylko w pierwszej komórce każdego wiersza, ale nie zaznaczyłeś spacji 12, po wskazaniu 3 wierszy. Aby uzyskać więcej informacji o pamięci w tablicach wielowymiarowych, spójrz tutaj:
Jak formatowane są wielowymiarowe tablice w pamięci?
-1 dla odpowiedzi nr 3
+---------------------------------------------------------------------------------+
| a[0][0] <--a[0][1] <--a[0][0] |
| a[0][1] <--a[0][2] |
| a[0][2] <--a[0][3] |
| a[0][3] . |
| a[1][0] . <--a[1][0] |
| a[1][1] . |
| a[1][2] . |
| a[1][3] . |
| a[2][0] . <--a[2][0] |
| a[2][1] . |
| a[2][2] <--a[0][10] |
| a[2][3] <--a[0][11] |
| ^ ^ <--a[3][0] <-- already memory overflow ! |
| | | . |
| array memory Y 1th code . |
| others all memory overflow! |
| |
| you 2th code |
+---------------------------------------------------------------------------------+
Więc możesz użyća[i/4][i%4]
tylko upewnij się, że nie ma przepełnienia pamięci.
Pozwól mi powiedzieć : oczywiście, że twój pierwszy kod ma rację, nie sądzę, że to szczęście. W C dwuwymiarowa tablica jest zawsze połączona z dwuwymiarowym zestawieniem. Jednak, patrz moje zdanie, Nie warto tego używać.
Jeśli naprawdę potrzebujesz prędkości, nie chcesz /
i „%” Myślę, że nadal możesz użyć cide 1.