Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Fooly
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147

Недопонимание указателей

03.09.2012, 14:20. Показов 3720. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже прошёл их по книжке давно, но они частенько встречаются, и я никак не могу понять некоторые процессы с ними.
Допустим есть в классе какие-то данные типа int lim, char name[lim]
Методы принимают указатели допустим Name::Name (const char * nm)
почему при копировании std::strncpy (name, nm, lim-1) мы указываем просто nm, а не *nm ? Ведь nm - это адрес, а само значение это *nm. Т.е по сути в name мы копируем адрес, но всё правильно работает и выводит то, что надо, а не адрес, как я думаю. Поясните плз, что я не таак понимаю
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.09.2012, 14:20
Ответы с готовыми решениями:

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Недопонимание кода
Я разбираю некоторый код С++ (Сразу скажу, что учил с++ самостоятельно, не супер профи) и там есть некоторые строчки, которые я не до конца...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

32
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.09.2012, 18:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Intel~lect Посмотреть сообщение

Не по теме:

Не кажется ли вам, что мы немного от главной темы отошли :D

Так вроде же объяснили. В моём понимании, функция ожидает две с-строки, по описанию. Через второй ф/параметр передается значение переменной объявленной как char* и если она корректно инициализирована, то является ссылкой и может быть преобразована к с-строке (массиву символов), то есть по сути ею и является. И всё хорошо. Можно конечно изголиться так, что бы и не преобразовать было корректно, но зачем?
0
 Аватар для kotleta
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
14.09.2012, 16:25
Кстати, а почему так происходит?
Я про пример Hydrogen

Отправили переменную int g себе ее скопировал (положил значение в свою ячейку)
инкрементировался, потом еще инкрементировался
Потом вышли из блока, и память освободилась, и 6 в ячейке памяти осталось, только теперь эта ячейка свободна, и другая переменная ее может использовать.

В чем дело?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.09.2012, 17:08
Цитата Сообщение от kotleta Посмотреть сообщение
Кстати, а почему так происходит?
Я про пример Hydrogen
Отправили переменную int g себе ее скопировал (положил значение в свою ячейку)
инкрементировался, потом еще инкрементировался
Потом вышли из блока, и память освободилась, и 6 в ячейке памяти осталось, только теперь эта ячейка свободна, и другая переменная ее может использовать.
В чем дело?
Если я понял в чем вопрос:
Сигнатура объявления или заголовок функции:
Тип Имя ( Тип1 <Имя1>, Тип2 <Имя2>, Тип3 <Имя3>....);
В сигнатуре описания:
Тип Имя ( Тип1 Имя1, Тип2 Имя2, Тип3 Имя3....){}
Это не спроста, что здесь Имя1, Имя2, Имя3 должны быть указаны. Потому, что в скобках показано объявление, локальных внутри функции как блока (см. фиг. скобки), переменных. В них функция копирует передаваемые параметры. Независимо от того, значения это или адреса (указатели, ссылки). При копировании, производится преобразование типов, если требуется и возможно.
То есть при передаче значения, функция работает с копией переданного значения, а при передаче указателя, - с копией указателя. Разница в том, что если в функции указатель разыменовывается, то несмотря на то, что указатель - копия, доступ получается к значению переменной на которую он указывает. Тогда если происходит изменения этого значения, то адресуемая указателем переменная изменится везде, где её видно и за пределами функции.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.09.2012, 17:25
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сигнатура объявления или заголовок функции:
Тип Имя ( Тип1 <Имя1>, Тип2 <Имя2>, Тип3 <Имя3>....);
В сигнатуре описания:
Тип Имя ( Тип1 Имя1, Тип2 Имя2, Тип3 Имя3....){}
Это не спроста, что здесь Имя1, Имя2, Имя3 должны быть указаны.
[занудство]
В определении функции тоже можно не именовать аргументы. Естессно, к анонимному параметру тогда (гарантированно и переносимо) достучаться нельзя, но передавать хоть что-то при вызове функции надо. Банальный пример: префиксный и постфиксный инкременты.
[/занудство]
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 18:26
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
[занудство]
В определении функции тоже можно не именовать аргументы. Естессно, к анонимному параметру тогда (гарантированно и переносимо) достучаться нельзя, но передавать хоть что-то при вызове функции надо. Банальный пример: префиксный и постфиксный инкременты.
[/занудство]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
void test( int a, int )
{
   int* ptr = &a;
   
   std::cout << *ptr << '\n' << *( ptr + 1 ) << std::endl;
}
 
int main()
{
   test( 123, 456 );
   
   return 0;
}
Имеешь в виду такое? А что тут может быть непереносимого кроме разных calling convention? Ну, наверное, не каждый компилятор будет выделять память под неиспользуемый параметр, но на деле то все выделяют.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.09.2012, 18:56
Цитата Сообщение от Герц Посмотреть сообщение
Имеешь в виду такое? А что тут может быть непереносимого кроме разных calling convention? Ну, наверное, не каждый компилятор будет выделять память под неиспользуемый параметр, но на деле то все выделяют.
Ага, именно это и именно из-за протоколов вызова. За компилятором же остаётся право не только вычислять аргументы в том порядке, в каком ему нравится, но и размещать их в памяти так, как ему нравится. То есть не факт, что они будут идти именно так, как в списке аргументов.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 19:01
VC++ compiler развращает своими __stdcall, __thiscall и т.п. :-)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.09.2012, 19:26
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
[занудство]
В определении функции тоже можно не именовать аргументы. Естессно, к анонимному параметру тогда (гарантированно и переносимо) достучаться нельзя, но передавать хоть что-то при вызове функции надо. Банальный пример: префиксный и постфиксный инкременты.
[/занудство]
Конечно, не боевик! Что и говорить. Но я попробовал ответить (угадать что ответить) kotleta на вопрос:
Цитата Сообщение от kotleta Посмотреть сообщение
Кстати, а почему так происходит?
Я про пример Hydrogen
Отправили переменную int g себе ее скопировал (положил значение в свою ячейку)
инкрементировался, потом еще инкрементировался
Потом вышли из блока, и память освободилась, и 6 в ячейке памяти осталось, только теперь эта ячейка свободна, и другая переменная ее может использовать.
В чем дело?
Мы же в разделе новичков и нужно, что бы всем было понятно.
Вот, фрагмент вызвавший вопрос:
Цитата Сообщение от Hydrogen Посмотреть сообщение
Указатели нужны еще и потому, что изменения, которые происходят в
C++
1
2
3
4
5
{
   *g++;// g равно 5
   *g++;// g равно 6
   return 0;
}// а теперь g равно 6
Как я понял вопрос, так и ответил.
Хотя вопрос бы мог и так звучать:
Приоритет ++ выше чем у разадресации. То есть сначала передвинули указатель, а потом разадресовали?
Думаю, - механическая ошибка. Имелось в виду:
C++
1
2
3
4
5
{
   (*g)++;// g равно 5
   (*g)++;// g равно 6
   return 0;
}// а теперь g равно 6
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
14.09.2012, 19:34
Да, у постфиксного инкремента/декремента приоритет выше. Но тут можно запутаться, поэтому лучше всегда ставить скобки. Например при префиксном инкременте/декременте если знак операции стоит слева от знака разыменования, то сначала будет получен объект, и потом к нему будет применена операция инкремента.
C++
1
2
3
++*g; //тут происходит операция инкремента объекта
*++g; //тут уже будет инкремент указателя
*g++; //ну а тут будет только инкремент указателя
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.09.2012, 19:44
Цитата Сообщение от Toshkarik Посмотреть сообщение
C++
1
*g++; //ну а тут будет только инкремент указателя
Боюсь не только. После инкремента указателя, еще чтение по адресу в анонимную переменную. То есть, есть подозрение, что если много раз подряд, так сделать (непреднамеренно), в цикле например, то можно получить ошибку защиты. Или нет?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
14.09.2012, 19:48
IGPIGP, не ну это само собой. Я имел ввиду, что без скобок не инкрементировать значение, как это получается с префиксными.
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, есть подозрение, что если много раз подряд
По идеи и второго раза может быть достаточно.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.09.2012, 20:02
Цитата Сообщение от Toshkarik Посмотреть сообщение
IGPIGP, не ну это само собой. Я имел ввиду, что без скобок не инкрементировать значение, как это получается с префиксными.
По идеи и второго раза может быть достаточно.
Еще забавнее, что если память для ситуации выделена "удачно" (закон бутерброда), то есть скажем, g указывает на элемент массива, то в этом случае не выходя за его пределы, получим логическую ошибку. Труд по исправлению такой кривизны, не стоит пары круглых скобок.
0
 Аватар для cmath
2525 / 1751 / 152
Регистрация: 11.08.2012
Сообщений: 3,349
16.09.2012, 11:36

Не по теме:

Во понаписали-то... Да, скобки забыли-с извиняюсь

Цитата Сообщение от IGPIGP Посмотреть сообщение
Приоритет ++ выше чем у разадресации. То есть сначала передвинули указатель, а потом разадресовали?
Думаю, - механическая ошибка. Имелось в виду:
Да, это и имелось ввиду. Скобки (и не только) у меня кст иногда браузер (Opera Next, багов полный огород н да, юзаю т.к. предыдущая версия неправильно отображала страницы форума) затирает при добавлении тегов, когда пишу сообщение.



Добавлено через 5 минут
C++
1
2
3
4
5
6
7
int g = 4;
int f()
{
   g++;// g равно 5
   g++;// g равно 6
return 0;
}// на выходе g опять равно 4
и
C++
1
2
3
4
5
6
7
8
int *g;
*g=new int(4);
int f()
{
   (*g)++;// g равно 5
   (*g)++;// g равно 6
return 0;
}// g = 6
Так сойдет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.09.2012, 11:36

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using...

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что...

Будоражащее недопонимание цикла
#include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class Data { public: char f; char l ; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru