Вказівники 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 однакові, отримуємо *pc1.

Візьмемо ще один приклад.

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

Ми призначили адресу c вказівнику ПК.

Then, we changed *pc to 1 using *pc = 1;. Since pc and the address of c is the same, c will be equal to 1.

Let's take one more example.

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

Initially, the address of c is assigned to the pc pointer using pc = &c;. Since c is 5, *pc gives us 5.

Then, the address of d is assigned to the pc pointer using pc = &d;. Since d is -15, *pc gives us -15.

Example: Working of Pointers

Let's take a working example.

 #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; ) 

Output

 Address of c: 2686784 Value of c: 22 Address of pointer pc: 2686784 Content of pointer pc: 22 Address of pointer pc: 2686784 Content of pointer pc: 11 Address of c: 2686784 Value of c: 2 

Explanation of the program

  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;

Тепер ви знаєте, що таке вказівники, і ви дізнаєтесь, як вказівники пов'язані з масивами, у наступному уроці.

Цікаві статті...