W tym artykule opiszę w jaki sposób przekazujemy tablicę do wnętrza funkcji poprzez jej argumenty. Omówię tablice jedno i wielowymiarowe:
- tablica jednowymiarowa sposób 1
- tablica jednowymiarowa sposób 2
- tablica wielowymiarowa sposób 1
- tablica wielowymiarowa sposób 2
Na wstępie pragnę zauważyć, że nazwa tablicy jest wskaźnikiem na jej pierwszy element. Oznacza to, że przekazując tablicę będziemy pracować na jej oryginalnym adresie (wszelkie zmiany w modyfikacji tablicy będą widoczne w miejscu, gdzie ją stworzyliśmy).
Konstrukcja nagłówka funkcji dla tablicy jednowymiarowej
sposób 1:
typ_funkcji nazwa(typ_elementów_tablicy nazwa_tablicy[]);
Można opcjonalnie w nawiasie podać ilość elementów tablicy.
Przykładowa funkcja może wyglądać następująco:
void funkcja(int tablica[10]);
Zadanie. 1. Napisz program, który zamieni wartości tablicy 10 elementowej na ich kwadraty.
#include<iostream> #include<cstdlib> using namespace std; void zamiana(int tab[]) { for(int i=0; i<10; i++) tab[i]*=tab[i]; //lub tab[i] = tab[i] * tab[i]; } int main() { //inicjacja tablicy int tablica[10] = {0, 3, 4, 3, 6, 7, 11, -5, -10, 87}; //wypisanie elementów tablicy for(int i=0;i<10;i++) cout<<tablica[i]<<" "; cout<<endl; //wstawienie znaku końca linii (enter) //wykonanie polecenia zamiana(tablica); //przekazując tablicę, podajemy tylko jej nazwę //ponowne wypisanie elementów tablicy for(int i=0;i<10;i++) cout<<tablica[i]<<" "; cout<<endl; system("pause"); return 0; } |
Wyście:
0 3 4 3 6 7 11 -5 -10 87 0 9 16 9 36 49 121 25 100 7569
Uwaga!!!. Przekazując tablicę wpisujemy tylko jej nazwę bez nawiasu kwadratowego. |
Konstrukcja nagłówka funkcji dla tablicy jednowymiarowej sposób 2:
typ_funkcji nazwa(typ_elementów_tablicy *nazwa_tablicy);
Drugim sposobem jest przekazanie tablicy poprzez wskaźnik na pierwszy element tej tablicy.
Program będzie się różnił tylko nagłówkiem funkcji:
void zamiana(int *tab) { for(int i=0; i<10; i++) tab[i]*=tab[i]; //lub tab[i] = tab[i] * tab[i]; } |
Konstrukcja nagłówka funkcji dla tablicy wielowymiarowej
sposób 1:
Pierwszy sposób jest podobny jak w przypadku tablicy jednowymiarowe. Przykład dotyczy tablicy dwuwymiarowej. Tablice o większej liczbie wymiarów przekazujemy podobnie. Przeanalizujmy zadanie:
Zadanie. 2. Napisz program, który zamieni wartości tablicy dwuwymiarowej o wymiarach 3x3, na ich kwadraty. Tablicę wypełniamy liczbami pseudolosowymi z przedzialu [0..9].
#include<iostream> #include<cstdlib> using namespace std; void zamiana(int tab[3][3]) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) tab[i][j]*=tab[i][j]; //lub tablica[i][j] = tablica[i][j]*tablica[i][j]; } int main() { //inicjacja tablicy dwuwymiarowej int tablica[3][3] = {{1, 2, 3}, {4, 5, 6}, {-1, -2, -3}}; //wypisanie elementów tablicy for(int i=0;i<3;i++) for(int j=0;j<3;j++) cout<<tablica[i][j]<<" "; //lub tablica[i][j] = tablica[i][j]*tablica[i][j]; cout<<endl; //wstawienie znaku końca linii (enter) //wykonanie polecenia zamiana(tablica); //przekazując tablicę, podajemy tylko jej nazwę //ponowne wypisanie elementów tablicy for(int i=0;i<3;i++) for(int j=0;j<3;j++) cout<<tablica[i][j]<<" "; //lub tablica[i][j] = tablica[i][j]*tablica[i][j]; cout<<endl; system("pause"); return 0; } |
Przykładowe wyjście:
1 2 3 4 5 6 -1 -2 -3 1 4 9 16 25 36 1 4 9
Konstrukcja nagłówka funkcji dla tablicy wielowymiarowej
sposób 2:
Drugi sposób opiera się na utworzeniu tablicy dynamicznej postaci:
typ_tablicy **nazwa_tablicy;
Przeanalizujmy powyższe zadanie rozwiązane tym sposobem:
#include<iostream> #include<cstdlib> using namespace std; void zamiana(int **tab) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) tab[i][j]*=tab[i][j]; //lub tab[i][j] = tab[i][j]*tab[i][j]; } int main() { srand(time(NULL)); //ustawienie ziarna //deklarujemy tablicę dynamicznie int **tablica = new int *[3]; for(int i=0;i<3;i++) tablica[i] = new int [3]; //przypisanie do tablicy losowych liczb z przedziału [0..9] for(int i=0;i<3;i++) for(int j=0;j<3;j++) tablica[i][j] = rand()%10; //wypisanie elementów tablicy for(int i=0;i<3;i++) for(int j=0;j<3;j++) cout<<tablica[i][j]<<" "; cout<<endl; //wstawienie znaku końca linii (enter) //wykonanie polecenia zamiana(tablica); //przekazując tablicę, podajemy tylko jej nazwę //ponowne wypisanie elementów tablicy for(int i=0;i<3;i++) for(int j=0;j<3;j++) cout<<tablica[i][j]<<" "; cout<<endl; system("pause"); return 0; } |
Tablice przydzielane dynamicznie opisane są tutaj.