Mam tablicę int
i potrzebuję znaleźć liczbę elementów w nim. Wiem, że ma to coś wspólnego z sizeof
, ale nie jestem pewien, jak go dokładnie użyć.Jak mogę znaleźć liczbę elementów w tablicy?
Odpowiedz
int a[20];
int length;
length = sizeof(a)/sizeof(int);
i można go używać w inny sposób, aby kod nie może być zakodowany do int
powiedzieć, czy masz tablicę array
wystarczy:
int len = sizeof(array)/sizeof(array[0]);
Jeśli masz macierz w zasięgu, możesz użyć sizeof
, aby określić jej rozmiar w bajtach i użyć podziału, aby obliczyć liczbę elementów:
#define NUM_OF_ELEMS 10
int arr[NUM_OF_ELEMS];
size_t NumberOfElements = sizeof(arr)/sizeof(arr[0]);
Jeśli otrzymasz tablicę jako argument funkcji lub przydzielić tablicę w stercie nie można określić jego rozmiar używając sizeof
. Będziesz musiał przechowywać/przekazać informacje o rozmiarze jakoś, aby móc z niego korzystać:
void DoSomethingWithArray(int* arr, int NumOfElems)
{
for(int i = 0; i < NumOfElems; ++i) {
arr[i] = /*...*/
}
}
Osobiście uważam, że sizeof (a)/sizeof (* a) wygląda czystsze.
ja też wolą określenie go jako makro:
#define NUM(a) (sizeof(a)/sizeof(*a))
Wtedy można go użyć w for-pętle, wygląda następująco:
for (i = 0; i < NUM(a); i++)
Możesz to zrobić, ale spowoduje to obliczenie rozmiaru za każdym razem, gdy wykona test w pętli for, czyli po każdej iteracji. I tak robiłby podział za każdym razem, gdy byłby w pętli. Byłoby bardziej skuteczne przypisanie wyniku 'NUM (a)' do zmiennej instancji tuż nad pętlą i użycie tej wartości w pętli. – Gavin
@Gavin nie, nie obliczyłby rozmiaru dla każdej iteracji. Kompilator jest wystarczająco inteligentny, aby zobaczyć, że wyniki każdego rozmiaru oraz podziału są stałe i określają wynik w czasie kompilacji, który następnie kompiluje do kodu jako stała liczba. Być może wprowadziłeś w błąd przez wygląd aplikacji 'sizeof', która wygląda jak funkcja z powodu nawiasów, ale nie jest funkcją. 'sizeof' jest operatorem, a nawiasy są tylko konwencją. – blubberdiblub
template <typename Type, int N>
inline int getElementCount(Type (&array)[N])
{
(void)array; // (required to avoid a spurious warning in MS compilers)
(void)sizeof(0[array]); // This line should cause an error if you pass an object with a user-defined subscript operator
return N;
}
Niewłaściwy język. –
Użyłem następujący kod jak zasugerowano powyżej do oceny liczby elementów w mojej dwuwymiarowej tablicy:
#include <stdio.h>
#include <string.h>
void main(void)
{
char strs[3][20] =
{
{"January"},
{"February"},
{""}
};
int arraysize = sizeof(strs)/sizeof(strs[0]);
for (int i = 0; i < arraysize; i++)
{
printf("Month %d is: %s\n", i, strs[i]);
}
}
To działa ładnie. O ile wiem, nie można mieszać różnych typów danych w tablicach C, a także powinieneś mieć taki sam rozmiar wszystkich elementów tablicy (jeśli mam rację), dlatego możesz skorzystać z tego z tą małą sztuczką:
- liczba liczba bajtów z sizeof (funkcja) z całym 2d tablicy (w tym przypadku 3 x 20 = 60 bajtów) Numer
- liczba bajtów z sizeof() funkcję z pierwszych Strs elementowa tablica [0] (w ten przypadek 20 bajtów)
- podzielić cały rozmiar z rozmiaru jednego elementu, co daje liczbę elementów
To przecięcie powinno być przenośne dla tablic 2d w C, jednak w innych językach programowania nie mogło by działać, ponieważ można używać różnych typów danych w tablicy o różnych rozmiarach (jak w JAVA).
Nie można znaleźć liczby elementów w tablicy, chyba że jest to tablica znaków. Rozważmy poniższy przykład:
int main()
{
int arr[100]={1,2,3,4,5};
int size = sizeof(arr)/sizeof(arr[0]);
printf("%d", &size);
return 1;
}
Powyższa wartość daje nam wartość 100, nawet jeśli liczba elementów wynosi pięć. Jeśli jest to tablica znaków, możesz przeszukiwać liniowo łańcuch zerowy na końcu tablicy i zwiększać licznik w miarę przechodzenia.
Chciałem napisać: printf ("% d", size); '. Ale masz rację, możesz znaleźć tylko określony rozmiar tablicy, a nie rzeczywisty rozmiar! – uetoyo
#include<stdio.h>
int main()
{
int arr[]={10,20,30,40,50,60};
int *p;
int count=0;
for(p=arr;p<&arr+1;p++)
count++;
printf("The no of elements in array=%d",count);
return 0;
}
wyjściowy = 6
OPIS
p
jest wskaźnik do tablicy 1-D, i w pętli for(p=arr,p<&arr+1;p++)
że wykonany p
wskaż adresu bazowego . Załóżmy, że jego adres bazowy to 1000; jeśli zwiększymy wartość o p
, to wskaże ona 1002 i tak dalej. Teraz przychodzący do pojęcia &arr
- W zasadzie reprezentuje on całą tablicę, a jeśli dodamy 1 do całej tablicy, tj. &arr+1
, podaje ona adres 1012, tj. Adres następnej tablicy 1-D (w naszym przypadku rozmiar int jest 2), więc warunek staje się 1000 < 1012.
więc w zasadzie warunek staje się
for(p=1000;p<1012;p++)
a teraz sprawdzić stan i policzyć wartość
- 1st czas
p=1000
ip<1012
warunek jesttrue
: wprowadzić w pętli zwiększamy wartośćcount
do 1. - 2 raz
p=1002
ip<1012
warunek jesttrue
: wprowadzić w pętli zwiększamy wartośćcount
do 2. - ...
- 6-te czas
p=1010
ip<1012
warunek jesttrue
: wprowadzić w pętli zwiększamy wartośćcount
do 6. - Ostatni raz
p=1012
ip<1012
warunek jest fałszywy: drukowanie wartościcount=6
wOświadczenie.
To nie działa (przynajmniej w C++). Będziesz musiał rzucić '& arr + 1' na (int *) w ten sposób:' for (p = arr; p <(int *) (& arr + 1); p ++) ' – Staszek
W rzeczywistości nie ma właściwego sposobu zliczania elementów w dynamicznej tablicy całkowitej. Jednak polecenie sizeof działa poprawnie w systemie Linux, ale nie działa poprawnie w systemie Windows. Z punktu widzenia programisty, nie zaleca się używania sizeof do pobierania liczby elementów w tablicy dynamicznej. Powinniśmy śledzić liczbę elementów podczas tworzenia tablicy.
Operator' sizeof' zwróci tylko * rozmiar * tablicy * zadeklarowanej w tym samym zakresie *, w przeciwnym razie 'sizeof' po prostu zgłasza rozmiar * wskaźnika *, do którego tablica została przekonwertowana po przekazaniu jako parametr. Nie ma to nic wspólnego z systemem operacyjnym i nie ma zaleceń dotyczących używania 'sizeof' na żadnym z innych niż zrozumienie, co bierzesz' sizeof'. (* gra nie jest przeznaczona *). –
Najczęściej znaleźli prosty sposób wykonać długość tablicy wewnątrz pętli, tak jak tego
int array[] = {10, 20, 30, 40};
int i;
for (i = 0; i < array[i]; i++) {
printf("%d\n", array[i]);
}
Jeśli nie znamy liczbę elementów w tablicy i gdy wejście jest podana przez użytkownik w czasie wykonywania. Wtedy możemy napisać kod jak
kod C:
while(scanf("%d",&array[count])==1) {
count++;
}
C++ KOD:
while(cin>>a[count]) {
count++;
}
Teraz liczba będzie o zliczania liczby elementów tablicy, które zostały wprowadzone.
Spójrz na to. http://stackoverflow.com/questions/4081100/c-finding-the-number-ofements-elements-in-an-array – twain249
Jeśli korzystasz z MSVC, masz _countof –
Podczas gdy każdy ma rozwiązanie, chcę zwróć uwagę, że jest bardzo prawdopodobne, że nie ma możliwości znalezienia rozmiaru tablicy dynamicznej, chyba że nagrałeś rozmiar, ponieważ sizeof (a) wskaźnika a jest wielkością wskaźnika 'int * a = new int [10] ] 'w tym przypadku znalezienie' sizeof (* a) 'ma 4 bajty. Dlatego ważne jest, aby sprawdzać rozmiar tablicy. – CppLearner