Примеры указателей в с++ [закрыт]

92
18 декабря 2020, 04:20
Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 1 год назад.

Улучшить вопрос

Я с начала года начал изучать С++. Проблема в том, что я не совсем понял указатели и пропустил эту тему. Я понял, что указатель нужен, чтобы передать не значение, а саму переменную в функцию. Чтоб обращаться к элементам массива другим способом. Чтоб запутать тех, кто читает код)). Но всё-же в общем я их не понял, прошерстил много сайтов, пролистал темы про указатели, но так и не понял ничего. Можете накидать несколько наглядных примеров, где нужны указатели? Буду очень благодарен.

Answer 1

Язык С++ позволяет иметь доступ к адресам объектов, расположенных в памяти программы. Указатель это как раз переменная, в которой содержится адрес объекта.

Пример:

int a=10;
int *p=&a;
  1. В этом примере объект - переменная целого типа с именем "a".
  2. Значение этой целой переменной равно 10.
  3. Также в программе определена переменная типа "указатель на целое" с именем "p".
  4. В этой переменной типа "указатель на целое" с именем "p" содержится адрес целой переменной с именем "a".
Answer 2

Указатели хорошая штука, если ты понимаешь что делаешь, иначе указатели могут стать для тебя огромной проблемой в решении задач. Но все по порядку.

  1. Указатель как самостоятельная единица, а именно:

    int *p;

В данном случае ты объявил указатель на целочисленный тип int. Что это значит? А значит это, то что данная переменная-указатель p может указывать на определенный объект типа int. Переменная-указатель хранит адрес другого объекта или функции. Далее, чтобы заставить указатель указывать на определенный объект, ему надо присвоить адрес этого объекта:

int i = 666;
p = &i;

Что имеем. Ты объявил указатель p и переменную i типа int. Далее представим примерно, именно примерно, как это выглядит в памяти:

Переменная               i            p
Значение в памяти       666         0x40000
Адрес                 0x40000       0x40004

В данном случае, переменная i хранит ни что иное как числовое значение 666, также в памяти компьютера эта переменная располагается по адресу 0x40000. Переменная-указатель p хранит ни что иное как адрес, другой переменной, в данном случае переменной i(0x40000), но наша переменная указатель также где-то располагается в памяти компьютера по адресу 0x40004.

Теперь ты можешь обращаться к переменной i через указатель p используя оператор разыменования (*). Данный оператор просто предоставляет возможность обращения к объекту, в данном случае к i, через указатель.

*p = 100;

В данном случае происходит обращение к переменной i и изменение ее значения.

2.Указатель на массив. Помни, имя переменной массива по сути является указателем на его первый элемент:

   int arr[5] = {1, 2, 3, 4, 5};
   int *p = arr; //В p попадает адрес первого элемента массива
   arr.cout << *p << endl; //Вывод будет 1

3.Указатель на функцию. Допустим имеем простую функцию:

void func()
{
  cout << "Hello, Кривой ИИ << endl;
}

Указатель на данную функцию будет иметь вид:

void(*p)();//указатель на функцию
p = func;//В переменной p адрес нашей функции func

Теперь к функции можно обращаться через указатель p:

p();

Вообще примеров можно приводить бесконечно много. Я привел тебе пример с адресами, чтобы в будущем ты понимал как это работает. Указатели также могут быть на структуры, на void, указатель на указатель и так далее.

Используются указатели в связных списках например. Также чтобы проще управлять большими объемами данных используют указатели, чтобы работать с указателями на данные, а не с самими данными. Для сортировки больших данных. Для передачи больших записей в функцию экономичней будет передавать указатель на эти записи, чем их содержимое.

READ ALSO
Qt5: как обновить данные в QTableWidget

Qt5: как обновить данные в QTableWidget

Есть некоторая таблица в которую из базы данных через промежуточную структуру подгружаются данные(вектор объектов класса)В структуре данные...

107
Звёздочка (*) перед классом

Звёздочка (*) перед классом

Что означает такая конструкция?

93
Отловить сочетание клавиш в консоли

Отловить сочетание клавиш в консоли

1) Код должен быть или кроссплатформенный, или 2а варианта кода (под Windows и Linux)

132
Проблема с PlaySoundA

Проблема с PlaySoundA

Воспроизвожу звук так:

116