Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 1 год назад.
Я с начала года начал изучать С++. Проблема в том, что я не совсем понял указатели и пропустил эту тему. Я понял, что указатель нужен, чтобы передать не значение, а саму переменную в функцию. Чтоб обращаться к элементам массива другим способом. Чтоб запутать тех, кто читает код)). Но всё-же в общем я их не понял, прошерстил много сайтов, пролистал темы про указатели, но так и не понял ничего. Можете накидать несколько наглядных примеров, где нужны указатели? Буду очень благодарен.
Язык С++ позволяет иметь доступ к адресам объектов, расположенных в памяти программы. Указатель это как раз переменная, в которой содержится адрес объекта.
Пример:
int a=10;
int *p=&a;
Указатели хорошая штука, если ты понимаешь что делаешь, иначе указатели могут стать для тебя огромной проблемой в решении задач. Но все по порядку.
Указатель как самостоятельная единица, а именно:
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, указатель на указатель и так далее.
Используются указатели в связных списках например. Также чтобы проще управлять большими объемами данных используют указатели, чтобы работать с указателями на данные, а не с самими данными. Для сортировки больших данных. Для передачи больших записей в функцию экономичней будет передавать указатель на эти записи, чем их содержимое.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть некоторая таблица в которую из базы данных через промежуточную структуру подгружаются данные(вектор объектов класса)В структуре данные...
1) Код должен быть или кроссплатформенный, или 2а варианта кода (под Windows и Linux)