// Uwaga: najpierw zapoznaj się z regułą 'prawo-lewo' określania typów zmiennych.
#include <iostream>
#include <typeinfo>
using namespace std;
void f ( int t [] , int* p )
{
cout << "Funkcja F: " << sizeof( t ) << " " << sizeof( p ) << " " << typeid( t ).name() << endl;
}
void g ( int t [10] , int* p ) // t pełni rolę tablicy, ale jest przekazywana przez wskaźnik, więc bez informacji o rozmiarze
{
cout << "Funkcja G: " << sizeof( t ) << " " << sizeof( p ) << " " << typeid( t ).name() <<endl;
}
void h( int (*t) [10], int** p ) // t jest wskaźnikiem na tablicę 10-elementową. Wówczas *t jest tą tablicą. Rozmiar jest pamiętany.
{
cout << "Funkcja H: " << sizeof( *t ) << " " << sizeof( *p ) << " " << typeid( t ).name() <<endl;
}
void r( int (&t) [10], int* (&p) ) // t i p to referencje na: tablicę 10-elementową i wskaźnik do niej
{
cout << "Funkcja R: " << sizeof( t ) << " " << sizeof( p ) << " " << typeid( t ).name() <<endl;
}
int main ()
{
int t[ 10 ] ;
for (int i = 0; i < 10 ; i++)
t[i] = i;
int* p = t;
cout << "Main: " << sizeof( t ) << " " << sizeof( p ) << " " << typeid( t ).name() << endl;
f ( t , p ); // Tablica przekazana, ale rozmiar zostanie zapomniany
g ( t , p ); // Tablica przekazana, ale rozmiar zostanie zapomniany
h ( &t , &p ); // Rozmiar tablicy przekazany dobrze - mechanizmem wskaźników
r ( t , p ); // Rozmiar tablicy przekazany dobrze - mechanizmem referencji
/* Konstrukcja 1 :
Tablica 10 wskaznikow, kazdy trzyma adres i-tego elementu tablicy t */
cout << endl << "Konstrukcja 1: tablica zawierająca adresy elementów tablicy t: " << endl;
int* m [10]; // m jest tablicą, której elementami będą adresy elementów t.
for (int i = 0; i < sizeof(m) / sizeof(m[0]) ; i++)
{
t[i] = i;
m[i] = &t[i] ; // Tu przypisujemy adres kolejnego elementu
cout << *m[i] << " " ; // Tak działamy na wartościach
}
cout << endl << "sizeof (m) = " << sizeof (m) << endl; // 80, nie 40. Widać, że to tablica wskaźników.
/* Konstrukcja 2 :
Wskaznik na tablicę 10 intów */
cout << endl << "Konstrukcja 2: " << endl;
int (*k) [10]; // k jest wskaznikiem na tablicę 10 elementów int
k = &t ;
for (int i = 0; i < sizeof(*k) / sizeof( (*k) [0] ) ; i++)
{
cout << (*k) [i] << " " ; // Tak działamy na wartościach
}
cout << endl << "sizeof (*k) = " << sizeof (*k) << endl;
/* Konstrukcja 3 :
Referencja na tablicę 10 intów */
cout << endl << "Konstrukcja 3: " << endl;
int (&r) [10] = t; // k jest referencją na tablicę 10 elementów int
for (int i = 0; i < sizeof (r) / sizeof( r[0] ) ; i++)
{
cout << r[i] << " " ; // Tak działamy na wartościach
}
cout << endl << "sizeof (r) = " << sizeof (r) << endl;
return 0;
}