Чем так сложны указатели?

программирование computer science

Периодически слышу мнения о чрезмерной сложности указателей для изучения. Однако ничего сложного в них не вижу: те же арифметические операции адресами, и одна единственная специфичная для них и довольно очевидная операция - разыменование. Можно какой-нибудь пример на C, демонстрирующий сложное использование указателей?

Примечание:
строка 2[ptr] =777 - ptr[-1]; смутила
Может быть не 2[ptr] а ptr[2] ? Или это фича такая?

Вкратце, анализ:
ptr+=2; // ptr теперь указывает на элемент ar[2], равный 3
ptr[2] = 777 - ptr[-1]; // ar[4] = 777 - ar[2-1] = 775
ptr[ptr[1]-3] = 99; // ar[1] = 99
(*(*ztr)) = *ptr + 23 - ptr[2]; // ar[2] = ar[2] + 23 - ar[4] = 3 + 23 - 775 = -749
Итого, если все выше правильно, выйдет что-то в роде
1 99 -749 4 775 6
P.S> ух, так наверное не пишут =)

Примечание:
@@А!! Ну и, конечно, связь между указателем и массивом. Эта связи настолько тесная, что многие их не различают. А различие, между тем, есть и оно существенное вы его знаете и понимаете??@@
Хотелось бы по-подробнее. Различие пожалуй очевидно, поскольку массив это все таки структура данных, а указатель на массив это указатель на его первый элемент. Соответственно разница в sizeof. Или вы имели ввиду что-то другое?

@Вызов функции по адресу с какими-то аргументами: непонятно, функция какого типа будет вызвана во время исполнения и как то, что вы запихали в стек будет истолковано этой функцией. @ Как это? Указатель на функцию? Вроде бы они строго определяются, и даже контролируются передаваемые параметры (впрочем контроль можно обойти).
Ответы:
Обычно о сложности использования указателей говорят преподаватели своим студентам (которые в первые услышали слово программирование =).
Указатели действительно сложны, но не столько для изучения, сколько для анализа готового кода, его чтения и понимания. Языки допускающие косвенную адресацию, а тем более вызов функций по косвенности - это мрак для методов глобального анализа указателей современных оптимизирующих компиляторов. Но это оставим в стороне. Вопрос в изучении.
Работа с одиночными указателями не сложна.Но имидж сложности создают такие тестовые задания.Студенты дерут на голове волосы и на всю жизнь слово указатель и ссылка воспринимают как нечто ужасное.
Что распечатает данная программа? "
#include <iostream>
void main()
{
int * ptr,**ztr;
int ar[6] ={1,2,3,4,5,6};
ptr = ar;
ptr+=2;
ztr =&ptr;
2[ptr] =777 - ptr[-1];
ptr[ptr[1]-3] = 99;
(*(*ztr)) = *ptr + 23 - ptr[2];

for(int i = 0;i<6;i++)
cout<<ar[i] <<" ";
}
# Дополнение1
2[ptr]
Это нормальная языковая конструкция С++,как раз основанная на адресации элементов массива.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.