Jeśli funkcja ma parametr tablicy o określonym rozmiarze, dlaczego jest zastępowana wskaźnikiem?
Biorąc pod uwagę następujący program,
#include <iostream>
using namespace std;
void foo( char a[100] )
{
cout << "foo() " << sizeof( a ) << endl;
}
int main()
{
char bar[100] = { 0 };
cout << "main() " << sizeof( bar ) << endl;
foo( bar );
return 0;
}
Wyjścia
main() 100
foo() 4
- Dlaczego tablica jest przekazywana jako wskaźnik do pierwszego elementu?
- czy to dziedzictwo z C?
- co mówi norma?
- Dlaczego zrezygnowano ze ścisłego bezpieczeństwa Typu C++?
3 answers
Tak jest dziedziczona z C. Funkcja:
void foo ( char a[100] );
Będzie miał ustawiony parametr jako wskaźnik, i tak będzie:
void foo ( char * a );
Jeśli chcesz, aby typ tablicy był zachowany, powinieneś przekazać odwołanie do tablicy:
void foo ( char (&a)[100] );
C++ '03 8.3.5/3:
...Typ funkcji określa się za pomocą następujących reguł. Typ każdego parametru jest określany na podstawie własnego dekl-specifier-seq i deklarator. Po ustaleniu typ każdego parametru każdy parametr typu " array of T "lub" function returning T "jest dopasowany odpowiednio do" pointer to T " lub "pointer to function returning T"....
Aby wyjaśnić składnię:
Sprawdź regułę "prawo-lewo"w google; znalazłem jeden jej opis tutaj .
Do tego przykładu można by zastosować w przybliżeniu w następujący sposób:
void foo (char (&a)[100]);
Zacznij od identyfikatora " a "
'a' jest
Przesuń w prawo-znajdujemy )
, więc cofamy kierunek szukając (
. Gdy poruszamy się w lewo mijamy &
'a' jest odniesieniem
Po &
docieramy do otworu (
, więc odwracamy ponownie i patrzymy w prawo. Teraz widzimy [100]
'a' jest odniesieniem do tablicy 100
I znów cofamy kierunek aż do char
:
'a' jest odniesieniem do tablicy 100 chars
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-08 13:51:07
Tak. W C i c++ nie można przekazywać tablic do funkcji. Tak po prostu jest.
Dlaczego w ogóle robisz zwykłe tablice? Czy spojrzałeś na boost
/std::tr1::array
/std::array
albo std::vector
?
Zauważ, że możesz jednak przekazać odwołanie do tablicy o dowolnej długości do szablonu funkcji . Z czubka głowy:
template< std::size_t N >
void f(char (&arr)[N])
{
std::cout << sizeof(arr) << '\n';
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 07:01:55
W terminologii C/C++ istnieje słowo, które jest używane dla tablic statycznych i wskaźników funkcji- . Rozważmy następujący kod:
int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints
//...
void f(int a[]) {
// ...
}
// ...
f(intArray); // only pointer to the first array element is passed
int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5)
int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 16:53:07