Diskuze: Objasnenie pojmu pointer
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
int is_param(const char *argv, int (*p_function)())
{
for (int i = 0; argv[i] != '\0'; i++)
{
if (!p_function(argv[i]))
return 0;
}
return 1;
}
Volání pak probíhalo nějak takhle: is_param(argv[1], isalpha) nebo is_param(argv[1], isdigit)
Proč? Jen tak...
Vypadalo to hezky. Vím, že se dá ověřit i jednodušeji, jestli je řetězec
číslo/slovo, ale cílem bylo procvičit si základní věci bez použití
pokročilých funkcí..
Zkráceně - ukazatel na funkci můžeš použít třeba, když máš jeden kód
provádějící jednu věc - třeba průchod polem - a chceš tam používat
více různých funkcí a nechceš psát pro každý případ funkci (při
větším množství už by to bylo značně nepraktické)
3)
protože A[i] je ukazatel na i. prvek pole A.. Proměnná A je ukazatel (na
svůj první prvek) a A[i] rovná se *(A+1)
Takze volanie druhej funkcie vo nejakej funkcii nebude fungovat ? Treba na nu spravit ukazovatel a vtedy mozem v inej funkcii volat funkciu ? To je ten druhy bod. A kto mu tretiemu este sa chcem vratit ze ked je A ukazovatel na svoj prvy prvok tak preco ho potom inicializujem ako int *A; ???? A skusal som naplnat v cykle for sposobom *(A+i)=i; Ale nefungovalo mi to
Nevím, jestli tě správně chápu..
Samozřejmě, že můžeš ve funkci volat jakoukoliv funkci.. ale představ si, že máš nějakou složitou strukturu, kterou procházíš svou funkcí a něco tam děláš.. taková funkce může mýt třeba 100 řádků.
No a ty tam chceš dělat pokaždé něco jiného.. Dejme tomu, že máš dvacet funkcí, která tam chceš za určitých podmínek použít.. Buď to uděláš tak, že pro každou tu možnost napíšeš samostatnou možnost, tj.
for (int i = 0; argv[i] != '\0'; i++)
{
if (!isdigit(argv[i]))
return 0;
}
Pak další funkce:
for (int i = 0; argv[i] != '\0'; i++)
{
if (!moje_fce(argv[i]))
return 0;
}
a tak dál.. všímej, že pokaždé musíš znovu napsat ten cyklus.. pokud by to byla složitější struktura, budeš mít komplikovanější kód.. a obzvlášť, když tam budeš provádět x věcí.. a bude se ti měnit jen ta jedna funkce..
s pomocí ukazatele na fci ti zůstane jedna jediná funkce.. kterou si
vždycky zavoláš a jen jí upřesníš, kterou tu funkci má použít..
to *(A+i) vyzkouším.. nerad bych nějak mystifikoval..
To *(A+i) funguje..
Tu máš ukázku obou přístupů:
int main()
{
int n = 10;
int *A = (int *)malloc(n * sizeof (int));
for(int i = 0; i < n; i++)
{
*(A+i) = i;
}
for (int i = 0; i < n; i++)
printf("%i \n", A[i]);
}
Chybu máš v i <= n... V C začíná pole nulou.. tzn. když budeš mít n = 10, tak poslední prvek je i==9..
ještě k té deklaraci..
int *A; můžeš slovy říct jako: "A je ukazatel na int"
Kdybys tam tu hvězdičku nedal, byl by A normální int.. A je ukazatel protože jsi ho tak
deklaroval. Chtěl jsem tím říct, že každé pole je vlastně ukazatel na
první prvek.. Zároveň ale taky musíš překladači říct, jaký datový
typ.. aby věděl, kolik zabírá bytů v paměti a jak s ním pracovat..
takže třeba int pole[10]; je pole deseti intů.. a proměnná pole je
ukazatel na int, která ukazuje na první prvek..
mohl bys udělat třeba toto:
int *ukazatel2;
ukazatel2 = pole + 1;
ukazatel2 ti ukáže na stejný prvek jako pole[1]..
printf("%i \n", A[i]);
Pozeram na tento vypis a nebude mozne to vypisat takto ?
printf("%i \n", *(A+i)); kde to bude v cykle for tak isto ako ty. Bude to aj
takto fungovat ?
A este k tomu polu tak ja si urobim toto int *A = (int *)malloc(n * sizeof
(int));
kde malloc vracia adresu a ulozim si ju do *A ale tak ked vracia adresu tak mi
to dava ze by tam malo byt A iba nie ? vies mi toto vysvetllit ?
Jo.. jsou to ekvivalentní zápisy
to *A je tam protože je to deklarace a zároveň přiřazení..
můžeš to taky napsat takhle:
int *A;
A = (int *)malloc(n * sizeof (int));
Najhlavnejší rozdiel v
int A[10];
a
int *A = (int *) malloc(10 * sizeof(int));
je v tom, že prvý spôsob vytvorí pole v zásobníku a druhý v
halde(hromade). Ešte pre doplnenie.
Zásobník sa uvoľňuje sám, pamäť vyčlenená v halde sa musí uvoľniť
príkazom.
Zobrazeno 9 zpráv z 9.