*Pointers
It’s all about pointers…
Motivácia
Pokiaľ chcete naozaj rozumieť programovaniu v jazyku C, musíte porozumieť tomu, čo všetko sa deje s vašimi údajmi a programom na pozadí. Častokrát totiž nestačí len vedieť, že údaje sa nachádzajú niekde v pamäti, ale častokrát potrebujete k tým údajom pristupovať na základe ich adresy. Dnes sa pozrieme bližšie na prácu so smerníkmi.
Poznámka
Samotné príklady na tomto cvičení nebudú reprezentovať ideálne riešenia alebo postupy, ale budú slúžiť len pre osvojenie si predmetnej problematiky.
Ciele
- Naučiť sa nové možnosti použitia nástroja
cgdb
. - Naučiť sa pracovať s operátorom referencie
&
. - Naučiť sa pracovať s operátorom dereferencie
*
Postup
Know Your Enemy
V tomto kroku vytvoríte jednoduchý program na výpočet obsahu štvorca.
Popri tom sa naučíte niekoľko noviniek pri používaní nástroja
cgdb
a zoznámite sa s operátormi referencie a
dereferencie.
Úloha
Vytvorte súbor square.c
a vložte do neho nasledujúci
kód, s ktorým budete experimentovať:
#include <stdio.h>
double square(const double a){
double result = 0;
= a * a;
result return result;
}
int main(){
double a;
("Enter the side of square: ");
printf("%lf", &a);
scanf
double result = square(a);
("The result is: %.3f\n", result);
printf}
Úloha
Preložte, spustite a otestujte kód.
Ak ste pri prepisovaní alebo kopírovaní neurobili chybu, program sa spustí a pri zadaní strany o veľkosti 10 vypíše hodnotu 100.
Úloha
Vytvorte premennú p_result
, ktorá bude smerníkom na
premennú result
.
Začnite správnou deklaráciou premennej p_result
. To, či
ste správne priradili jej hodnotu, si môžete overiť buď kontrolným
výstupom alebo pomocou nástroja cgdb
.
Úloha
Po vypísaní výsledku ešte vypíšte adresu, hodnotu a veľkosť
zaberaného miesta v pamäti premnných result
a
p_result
.
Výstup by teda mohol vyzerať nasledovne:
The address of result is: 0x7ffff2a5abf8
The address of p_result is: 0x7ffff2a5abf0
The value of result is: 100.000000
The value of p_result is: 0x7ffff2a5abf8
The value of *p_result is: 100.000000
The size of result is: 8 bytes
The value of p_result is: 8 bytes
Swap (Again)
Funkcia swap na výmenu obsahu dvoch premenných. Znova. Tentokrát okrem dvoch celých čísiel vymení aj obsah dvoch reťazcov.
Úloha
Vytvrote súbor swaps.c
a vložte do neho nasledujúci
kód.
Kód programu:
#include <stdio.h>
void swap_nums(int *n1, int *n2) {
int tmp = *n1;
*n1 = *n2;
*n2 = tmp;
}
void swap_strings(char *str1, char *str2) {
char *tmp = str1;
= str2;
str1 = tmp;
str2 }
int main() {
// swap numbers
int a = 30;
int b = 40;
(&a, &b);
swap_nums("a is %d\n", a);
printf("b is %d\n", b);
printf
// swap strings
char *s1 = "First string";
char *s2 = "Second string";
(s1, s2);
swap_strings("s1 is %s\n", s1);
printf("s2 is %s\n", s2);
printf}
Úloha
Program preložte a spustite.
Úloha
Funkcia na výmenu reťazcov nefunguje správne a preto ju opravte.
Overte si jej správanie pomocou nástroja cgdb
. Všimnite
si, ako je to s výmenou parametrov vo funkcii swap_nums()
,
ako sú predávané adresy pomocou parametrov a následne porovnajte toto
správanie vo funkcii swap_strings()
.