Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 3 - Aritmetika ukazatelů v jazyce C

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Russin
DarkCoder:7.7.2021 17:08

V druhém řádku je definován ukazatel na typ int a je inicializován bázovou adresou pole nums.
Ukazateli nejsou přidělovány hodnoty pole. Jediné co jsem udělat je, že jsem hodnotu ukazatele p nastavil adresou pole nums, nic víc. Po tomto příkazu mohu pracovat s polem nums nepřímo pomocí ukazatele p. Ukazatel, je proměnná která obsahuje adresu jiného objektu. V tomto případě adresu pole nums.

Definuji-li pole a inicializuji-li ho nějakými hodnotami, leží tyto prvky v paměti za sebou. Adresa každého následující prvku je vyšší o velikost typu pole. Bude-li pole typu int a první prvek pole bude ležet např. na adrese 100, pak druhý prvek pole bude ležet na adrese 100 + sizeof(int).

Ano, ukazatel p bude ukazovat na začátek pole, adresa začátku pole je označována jako bázová adresa a na této adrese bude ležet prvek v našem případě s hodnotou 1. Pomocí bázové adresy a posunu mohu pomocí dereference ukazatele přistupovat k hodnotám pole na té které pozici.

V tomto případě nealokuji dynamicky žádnou paměť, paměť pro pole nums je přidělena staticky při spuštění programu. Dynamickou alokací se rozumí proces, při kterém si žádám od OS přidělení určitého množství paměti za běhu programu pomocí funkcí malloc() nebo calloc().

Odpovědět
7.7.2021 17:08
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Martin Russin:7.7.2021 18:08

V druhém řádku je definován ukazatel na typ int a je inicializován bázovou adresou pole nums. Ukazateli nejsou přidělovány hodnoty pole. Jediné co jsem udělat je, že jsem hodnotu ukazatele p nastavil adresou pole nums, nic víc.

Kedže si nastavil hodnotu ukazovateľa p na bázovú adresu poľa nums, nemal by potom kód vyzerať takto(keďže pracujeme s hodnotou adresy, nie z hodnotou na adrese)?

p = nums;

Po tomto příkazu mohu pracovat s polem nums nepřímo pomocí ukazatele p.

Má to nejakú výhodu oproti priamemu pracovaniu s poľom?

printf("%d\n", *(nums + 2));
printf("%d\n", *(p + 2));

V týchto prípadoch pracujem s adresami (či už poľa alebo ukazovateľa), na ktorých sa nachádzajú isté hodnoty a výsledok je rovnaký preto, lebo bázové adresy sú v oboch prípadoch rovnaké?

 
Odpovědět
7.7.2021 18:08
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Russin
DarkCoder:7.7.2021 19:18

Pokud definuji ukazatel a zároveň ho inicializuji adresou pole, pak se to zapisuje takto:

int nums[] = { 1,2,3,4,5 };
int *p = nums;

Pokud definuji ukazatel a v definici nepřiřazuji adresu objektu, pak se to zapisuje takto:

int nums[] = { 1,2,3,4,5 };
int *p = NULL;
p = nums;

Jméno pole bez indexu představuje ukazatel na začátek pole. Oproti klasickému ukazateli se liší v tom, že ukazatel na začátek pole je konstantní. Nelze jej tedy měnit. Pokud tedy chceme např. traversovat pole pomocí ukazatele, přiřadí se nejprve ukazatel na toto pole jinému ukazateli, který již lze modifikovat.

Máme-li

int  pole[] = {1, 2, 3, 4, 5};
int p = pole;

Pak:

pole++; // neplatný příkaz
p++; platný příkaz

Dále ve funkcích kde pole je předáváno jako parametr, respektivě je předáván ukazatel na toto pole a k poli se přistupuje pomocí tohoho formálního parametru.

Ano, pokud:

int nums[] = { 1,2,3,4,5 };
int *p = nums;

// pak p == nums

printf("%d\n", *(nums + 2));
printf("%d\n", *(p + 2));

// a oba příkazy jsou ekvivalentní, pouze přístup k hodnotě je nepatrně odlišný
Odpovědět
7.7.2021 19:18
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Martin Russin:7.7.2021 20:00

1, Čo hovorí/vykonáva tretí riadok kódu? Viem, že druhý riadok hovorí to, že ukazovateľ p na nič neukazuje.

int nums[] = { 1,2,3,4,5 };
int *p = NULL;
p = nums;

2, Nasledujúci riadok kódu je nesprávny? Ak áno, tak prečo?

int nums[] = { 1,2,3,4,5 };
int *p;
p = &nums;
 
Odpovědět
7.7.2021 20:00
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Russin
DarkCoder:7.7.2021 20:06
  1. Přiřadí adresu nums ukazateli p. Ukazatel p tak bude ukazovat na začátek pole nums.
  2. Jméno pole bez indexu je ukazatel na začátek pole. Příkaz je chybný, jelikož je nesprávný počet referencí. Kdyby nums byla obyčejná proměnná a nikoli pole, bylo by použití referenčního operátoru & správné.
Odpovědět
7.7.2021 20:06
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Martin Russin:7.7.2021 20:10

Aj meno poľa s indexom je ukazovateľ na začiatok poľa? Napr. nasledujúci kód je správny?

int pole[10];
int *p_pole = pole;
 
Odpovědět
7.7.2021 20:10
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Russin
DarkCoder:7.7.2021 20:44

Ne, pouze jméno pole bez indexu je ukazatel na začátek pole. Úryvek kódu je správný.

Odpovědět
7.7.2021 20:44
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 17.