LINUX.ORG.RU

Указатель на указатель массива указателей

 


2

1

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

// Из K&R:
int х = 1, у = 2;
int *ip;    /* ip - указатель на int */
ip = &x;    /* теперь ip указывает на x */
y = *ip;    /* y теперь равен 1 */
*ip = 0;    /* x теперь равен 0 */
В чем смысл указателей, если судя по примеру я могу сделать и y = x с тем же успехом, а дополнительные *ip как посредники лишь уменьшат читаемость?

UPDATE: Самое главное еще забыл добавить - зачем к этой кашке еще и «**»?

UPDATE++: посылаю комментаторам доброе слово, без них вопрос затянулся бы

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 3)
Ответ на: комментарий от qulinxao

Но если не вдаваться в такие подробности, суть я передал правильно. Хотя да, замечания верные. Учту:)

generator ★★★
()
Ответ на: комментарий от generator

Есть существенная разница между «флудить, пытаясь научиться» и «флудить, пытаясь выпендриться». Твоим способом тоже можно звездов насобирать, а можно и звездюлей от начальства.

qulinxao, у меня тоже такая непонятная речь будет после истории успеха с Си? А если без шуток, то зубрю пятый раздел в надежде, что «если долго мучиться, что-нибудь получится»

minakov ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Когда в старости захочется надфилем бревна для постройки бани циклевать, вот тогда и буду учить питон. А пока мне надо разобраться в указателях и структурах в Си. Плюсы тоже малоинтересны

minakov ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Я выше писал уже про абстракции. Если вас невозможно было научить, не используя фраз «представь, что этот коробок спичек - ты, а вот этот карандаш - машина. Это дорога, и если коробок выходит на нее, то объект карандаш сообщает ему ускорение с летальным исходом. Смотри как спичинки ломаются.», то языки тут не виноваты

minakov ★★★★★
() автор топика
Ответ на: комментарий от minakov

Да не в том дело. Я имею в виду, что на С++ легче нормальный софт писать. На си тяжело и бессмысленно из-за очень большой ручной работы. При этом С++ даже эффективнее код дает местами, но вообще они равны. Т.е. чистый С не нужен.

anonymous
()
Ответ на: комментарий от anonymous

Возможно ты прав, но труд сделал из обезьяны человека, а деградировать можно в любое время. После Си уже, конечно

minakov ★★★★★
() автор топика
Ответ на: комментарий от minakov

Ты опять таки не понял. С трудом там все точно так же, а понимания требуется еще больше. Там нет необходимости как раз в обезьяньей монотонной работе.

anonymous
()
Ответ на: комментарий от anonymous

Почем опиум для народа?

«Используй перфоратор с пылеуловителем - он быстрее дырку пробьет в стене!» А мне хочется понять, из чего стенка состоит, сколько пыли от дырки в 100x100мм. Абстрактно, плюсоугодно, доходчиво

minakov ★★★★★
() автор топика

Как тут пару раз намекалось, указатели хороши когда надо передать в другую часть программы (например функцию) большой объект. Т.е. можно передать(скопировать) не сам объект, а только адрес на него - указатель (или ссылку). Ещё указатели приходиться применять когда создаёшь динамический объект с помощью оператора new. Например, мы заранее не можем знать сколько данных будет получено по сети или сколько буковок введёт юзер в консоли. Самое правильное это выделить память под эти данные когда информация будет получена. И соответственно её объему мы выделим память. Но это будет не простая переменная, а указатель на объект который создаст new.

Khenty
()
Ответ на: комментарий от minakov

Не, в С++ тебе тоже придется все знать. Он избавляет от рутины, но не от необходимости знать и уметь. Это не Java тебе.

anonymous
()
Ответ на: комментарий от minakov

Это можно назвать «спортивное програмирование». Для развития мозга оно хорошо. Но денег за такие знания много не заплатят.

Khenty
()

It's like a finger poiting away to the moon. Don't concentrate on the finger...

anonymous
()
Ответ на: комментарий от Deleted
Если в записке написано "Спрыгни со скалы", это не значит, что надо обязательно прыгать. Если ты не можешь не выполнить то, что написано в записке, надо для начала прикинуть кто ее написал и зачем.
А еще лучше - быть уверенным что ты сам туда писал. Трезвый. Для себя.
trex6 ★★★★★
()
23 мая 2013 г.

Адреса

Здравствуйте.

На самом деле, все просто. Представим себе разговор почтальона и отправителя письма (здесь почтальон — код, созданный компилятором; письмо — значение переменной; адрес — память). Запись

int x, y;
x = 1;
y = 2;
x = y;
говорит почтальону: «Доставь письмо x'у, где бы он не жил (не зависимо от адреса в оперативной памяти)». Запись
...
int* ip;
ip = &x;
*ip = y;
говорит почтальону: «Доставь письмо по адресу &x, кто бы там не жил (какая бы переменная не находилась по этому адресу)». Вы можете с тем же успехом написать:
...
ip = 0xFFA0AA;
*ip = y;
и записать значение переменной y по адресу 0xFFA0AA в оперативной памяти (если система Вам позволит, что вряд ли ;-) ).

Вы правы, в данном случае, смысла в указателях нет. Но вот вам нужно передать переменную в функцию так, чтобы ее (переменной) значение можно было изменить. Если Вы напишите что-то вроде:

...
int foo(int x)
{
   x = 5;
}
...

z = 2;
foo(z);
...
то во время вызова функции foo(), значение переменной z будет скопировано в переменную x. Изменение внутри функции foo() значения переменной x никак не затронет значение переменной z (Вы ведь передали копию значения, помните?). Но если Вы напишите:
void foo(int* x)
{
   *x = 5;
}
...

int z = 2;
foo(&z);
...
то операция
*x = 5;
присвоит переменной z значение 5. Можно, конечно, определить z, как глобальную переменную, но это — моветон (прошу простить за транслитерацию).

А еще можно передать таким образом адрес функции. Например, в WinAPI заполнение структуры WNDCLASS содержит строку:

...
wc.lpfnWndProc = WndProc;
...
где WndProc — функция обработки сообщений окна. Не важно, адрес какой функции Вы передадите (ее имя не имее значения), система Windows вызовет WndProc для обработки сообщения окна (имя функции — указатель на ее начало в памяти).

mna-norn
()

Трёхзвёздочный пользователей не понимает указателей. Странные времена настали.

Deleted
()
Ответ на: комментарий от Deleted

Странно видеть человека, определяющего интеллект человека по количеству нафлуженных виртуальных регалий. Вот если бы звезды за решения задач давали, да с проверкой, то да.

mna-norn, спасибо, уже разобрался

minakov ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.