Рубрики

Указатели на C и C ++ | Набор 1 (Введение, Арифметика и Массив)

Указатели хранят адрес переменных или место в памяти.

// General syntax
datatype *var_name; 

// An example pointer "ptr" that holds
// address of an integer variable or holds
// address of a memory whose value(s) can
// be accessed as integer values through "ptr"
int *ptr;  

Использование указателя:

Чтобы использовать указатели в C, мы должны понимать ниже двух операторов.

  • Чтобы получить доступ к адресу переменной для указателя, мы используем унарный оператор & (амперсанд), который возвращает адрес этой переменной. Например, & x дает нам адрес переменной x.

    // Вывод этой программы может быть разным
    // в разных прогонах. Обратите внимание, что программа
    // печатает адрес переменной и переменной
    // можно назначить разные адреса в разных
    // работает.
    #include <stdio.h>

      

    int main()

    {

        int x;

      

        // Печатает адрес х

        printf("%p", &x);

      

        return 0;

    }

  • Еще один оператор — унарный * (Asterisk), который используется для двух вещей:
    • Чтобы объявить переменную-указатель: Когда переменная-указатель объявлена в C / C ++, перед ее именем должен стоять знак *.

      // C программа для демонстрации декларации
      // переменные указателя.
      #include <stdio.h>

      int main()

      {

          int x = 10;

        

          // 1) Поскольку в объявлении есть *, ptr

          // становится указателем переменной (переменная

          // который хранит адрес другой переменной)

          // 2) Так как перед * есть int, ptr

          // указатель на переменную целочисленного типа

          int *ptr;

        

          // & оператор, прежде чем x используется для получения адреса

          // из х. Адрес x назначен для ptr.

          ptr = &x;

        

          return 0;

      }

    • Для доступа к значению, сохраненному в адресе, мы используем унарный оператор (*), который возвращает значение переменной, расположенной по адресу, указанному ее операндом.

      // C программа для демонстрации использования * для указателей в C
      #include <stdio.h>

        

      int main()

      {

          // Нормальная целочисленная переменная

          int Var = 10;

        

          // Переменная-указатель, которая содержит адрес var.

          int *ptr = &Var;

        

          // Эта строка печатает значение по адресу, сохраненному в ptr.

          // Сохранённое значение является значением переменной "var"

          printf("Value of Var = %d\n", *ptr);

        

          // Вывод этой строки может отличаться в разных

          // работает даже на той же машине.

          printf("Address of Var = %p\n", ptr);

        

          // Мы также можем использовать ptr как lvalue (Левая рука

          // сторона назначения)

          *ptr = 20; // Значение по адресу теперь 20

        

          // Это печатает 20

          printf("After doing *ptr = 20, *ptr is %d\n", *ptr);

        

          return 0;

      }

      Выход :

      Value of Var = 10
      Address of Var = 0x7fffa057dd4
      After doing *ptr = 20, *ptr is 20
      

      Ниже наглядное представление вышеуказанной программы:

Выражения указателя и арифметика указателя
Ограниченный набор арифметических операций может быть выполнен над указателями. Указатель может быть:

  • увеличенный (++)
  • уменьшенный (-)
  • целое число может быть добавлено к указателю (+ или + =)
  • целое число может быть вычтено из указателя (- или — =)

Арифметика указателей не имеет смысла, если не выполняется над массивом.
Примечание. Указатели содержат адреса. Добавление двух адресов не имеет смысла, потому что нет понятия, на что оно будет указывать. Вычитание двух адресов позволяет вычислить смещение между этими двумя адресами.

// C ++ программа для иллюстрации арифметики указателей
// в C / C ++
#include <bits/stdc++.h>

  
// Драйвер программы

int main()

{

    // Объявляем массив

    int v[3] = {10, 100, 200};

  

    // Объявляем переменную указателя

    int *ptr;

  

    // Назначаем адрес v [0] для ptr

    ptr = v;

  

    for (int i = 0; i < 3; i++)

    {

        printf("Value of *ptr = %d\n", *ptr);

        printf("Value of ptr = %p\n\n", ptr);

  

        // Увеличиваем указатель ptr на 1

        ptr++;

    }

}

Output:Value of *ptr = 10
Value of ptr = 0x7ffcae30c710

Value of *ptr = 100
Value of ptr = 0x7ffcae30c714

Value of *ptr = 200
Value of ptr = 0x7ffcae30c718

Имя массива как указатели
Имя массива действует как константа указателя. Значение этой константы указателя является адресом первого элемента.
Например, если у нас есть массив с именем val, то val и & val [0] могут использоваться взаимозаменяемо.

// C ++ программа для иллюстрации имени массива как указателей в C ++
#include <bits/stdc++.h>

using namespace std;

  

void geeks()

{

    // Объявляем массив

    int val[3] = { 5, 10, 15};

  

    // Объявляем переменную указателя

    int *ptr;

  

    // Назначаем адрес val [0] для ptr.

    // Мы можем использовать ptr = & val [0]; (оба одинаковые)

    ptr = val ;

    cout << "Elements of the array are: ";

    cout << ptr[0] << " " << ptr[1] << " " << ptr[2];

  

    return;

}

  
// Драйвер программы

int main()

{

    geeks();

    return 0;

}

Output:
Elements of the array are: 5 10 15

Теперь, если этот ptr отправляется функции в качестве аргумента, то к массиву val можно обращаться аналогичным образом.

Указатели и многомерные массивы
Рассмотрим обозначение указателя для двумерных числовых массивов. рассмотрим следующую декларацию

int nums[2][3]  =  { {16, 18, 20}, {25, 26, 27} };

В общем, nums [i] [j] эквивалентно * (* (nums + i) + j)

Pointer NotationArray NotationValue
*(*nums)nums[0][0]16
*(*nums + 1)nums[0][1]18
*(*nums + 2)nums[0][2]20
*(*(nums + 1))nums[1][0]25
*(*(nums + 1) + 1)nums[1][1]26
*(*(nums + 1) + 2)nums[1][2]27

Статьи по теме :


Приложения указателей в C / C ++.

ВикториныТест по основам указателя , Тест по расширенному указателю

Ссылка:
https://www.ntu.edu.sg/home/ehchua/programming/cpp/cp4_PointerReference.html

Эта статья предоставлена Абхиравом Карией. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью, используя contrib.geeksforgeeks.org, или отправить свою статью по электронной почте на адрес contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Указатели на C и C ++ | Набор 1 (Введение, Арифметика и Массив)

0.00 (0%) 0 votes