C указатели (с примери)

В този урок ще научите за указатели; какви са указателите, как ги използвате и често срещаните грешки, с които може да се сблъскате, когато работите с тях с помощта на примери.

Указателите са мощни функции на програмирането на C и C ++. Преди да научим указатели, нека научим за адресите в програмирането на C.

Адрес в C

Ако имате променлива var в програмата си, &varще ви даде адреса й в паметта.

Използвали сме адрес много пъти, докато използваме scanf()функцията.

 scanf("%d", &var);

Тук стойността, въведена от потребителя, се съхранява в адреса на променливата var. Да вземем работещ пример.

 #include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; ) 

Изход

 var: 5 адрес на var: 2686778

Забележка: Вероятно ще получите различен адрес, когато стартирате горния код.

C указатели

Указателите (указателни променливи) са специални променливи, които се използват за съхраняване на адреси, а не на стойности.

Синтаксис на указателя

Ето как можем да декларираме указатели.

 int* p;

Тук декларирахме указател p от intтип.

Можете също да декларирате указатели по тези начини.

 int *p1; int * p2; 

Да вземем друг пример за деклариране на указатели.

 int* p1, p2;

Тук декларирахме указател p1 и нормална променлива p2.

Присвояване на адреси на указатели

Да вземем пример.

 int* pc, c; c = 5; pc = &c; 

Тук 5 се присвоява на променливата c. И, адресът на c се присвоява на компютърния указател.

Вземете стойност на нещата, посочени от указатели

За да получим стойността на вещта, посочена от указателите, използваме *оператора. Например:

 int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5

Тук адресът на cсе присвоява на компютърния указател. За да получим стойността, съхранена на този адрес, използвахме * pc.

Забележка: В горния пример pc е указател, а не *pc. Не можете и не трябва да правите нещо подобно *pc = &c;

Между другото, *се нарича оператор за пренасочване (при работа с указатели). Той работи върху указател и дава стойността, съхранена в него.

Промяна на стойността, посочена от указатели

Да вземем пример.

 int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1

Присвоихме адреса на c на указателя на компютъра.

След това променихме стойността на c на 1. Тъй като pc и адресът на c са еднакви, *pcни дава 1.

Да вземем друг пример.

 int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1 

Присвоихме адреса на c на указателя на компютъра.

След това променихме *pcна 1 с помощта *pc = 1;. Тъй като pc и адресът на c са еднакви, c ще бъде равно на 1.

Да вземем още един пример.

 int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15

Първоначално адресът на c се присвоява на компютърния указател с помощта pc = &c;. Тъй като c е 5, *pcни дава 5.

След това адресът на d се присвоява на компютърния указател с помощта pc = &d;. Тъй като d е -15, *pcни дава -15.

Пример: Работа на указатели

Да вземем работещ пример.

 #include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; ) 

Изход

 Адрес на c: 2686784 Стойност на c: 22 Адрес на компютър с указател: 2686784 Съдържание на компютър с указател: 22 Адрес на компютър с указател: 2686784 Съдържание на компютър с указател: 11 Адрес на c: 2686784 Стойност на c: 2 

Обяснение на програмата

  1. int* pc, c;

    Here, a pointer pc and a normal variable c, both of type int, is created.
    Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.
  2. c = 22;

    This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.
  3. pc = &c;

    This assigns the address of variable c to the pointer pc.
  4. c = 11;

    This assigns 11 to variable c.
  5. *pc = 2;

    This change the value at the memory location pointed by the pointer pc to 2.

Common mistakes when working with pointers

Suppose, you want pointer pc to point to the address of c. Then,

 int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;

Here's an example of pointer syntax beginners often find confusing.

 #include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )

Why didn't we get an error when using int *p = &c;?

It's because

 int *p = &c;

is equivalent to

 int *p: p = &c;

И в двата случая създаваме указател p(не *p) и го присвояваме &c.

За да избегнем това объркване, можем да използваме изявлението по следния начин:

 int* p = &c;

Сега знаете какво са указатели, ще научите как указателите са свързани с масиви в следващия урок.

Интересни статии...