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
  1. Dlaczego tablica jest przekazywana jako wskaźnik do pierwszego elementu?
  2. czy to dziedzictwo z C?
  3. co mówi norma?
  4. Dlaczego zrezygnowano ze ścisłego bezpieczeństwa Typu C++?
Author: einpoklum, 2009-08-25

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

 71
Author: Richard Corden,
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';
}
 13
Author: sbi,
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
 1
Author: DaddyM,
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