Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
#1

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

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

Уже прошёл их по книжке давно, но они частенько встречаются, и я никак не могу понять некоторые процессы с ними.
Допустим есть в классе какие-то данные типа int lim, char name[lim]
Методы принимают указатели допустим Name::Name (const char * nm)
почему при копировании std::strncpy (name, nm, lim-1) мы указываем просто nm, а не *nm ? Ведь nm - это адрес, а само значение это *nm. Т.е по сути в name мы копируем адрес, но всё правильно работает и выводит то, что надо, а не адрес, как я думаю. Поясните плз, что я не таак понимаю
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2012, 14:20     Недопонимание указателей
Посмотрите здесь:

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

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

Недопонимание с switch и выводом default - C++
Задание: сделать так что бы при вводе целого числа (от 1 до 7 которые соответствует дням недели, 1- понедельник, 2 -вторник и т.д.)...

массив указателей - C++
Есть массив указателей: char* arStr = {"BAC","ACB","QQQ", "SDF", "ABC"}; возможно ли, зная только адрес первого элемента массива...

Инициализация указателей - C++
Добрый вечер, объясните пожалуйста, что значит присвоение начальных значений указателям, как например в данном случае: float *fPtr =...

Осмысление указателей - C++
Пожалуйста расскажите более популярным языком что это такое и для чего они нужны. Перечитал несколько раз пару дополнительных источников -...

арифметика указателей - C++
Здравствуйте. Объясните, пожалуйста, код из инета: 1. "переменная A типа int приводится к типу unsigned" приводится к бесзнаковому...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6442 / 3081 / 306
Регистрация: 04.12.2011
Сообщений: 8,485
Записей в блоге: 4
03.09.2012, 18:59     Недопонимание указателей #21
Цитата Сообщение от Intel~lect Посмотреть сообщение

Не по теме:

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

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

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

В чем дело?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6442 / 3081 / 306
Регистрация: 04.12.2011
Сообщений: 8,485
Записей в блоге: 4
14.09.2012, 17:08     Недопонимание указателей #23
Цитата Сообщение от kotleta Посмотреть сообщение
Кстати, а почему так происходит?
Я про пример Hydrogen
Отправили переменную int g себе ее скопировал (положил значение в свою ячейку)
инкрементировался, потом еще инкрементировался
Потом вышли из блока, и память освободилась, и 6 в ячейке памяти осталось, только теперь эта ячейка свободна, и другая переменная ее может использовать.
В чем дело?
Если я понял в чем вопрос:
Сигнатура объявления или заголовок функции:
Тип Имя ( Тип1 <Имя1>, Тип2 <Имя2>, Тип3 <Имя3>....);
В сигнатуре описания:
Тип Имя ( Тип1 Имя1, Тип2 Имя2, Тип3 Имя3....){}
Это не спроста, что здесь Имя1, Имя2, Имя3 должны быть указаны. Потому, что в скобках показано объявление, локальных внутри функции как блока (см. фиг. скобки), переменных. В них функция копирует передаваемые параметры. Независимо от того, значения это или адреса (указатели, ссылки). При копировании, производится преобразование типов, если требуется и возможно.
То есть при передаче значения, функция работает с копией переданного значения, а при передаче указателя, - с копией указателя. Разница в том, что если в функции указатель разыменовывается, то несмотря на то, что указатель - копия, доступ получается к значению переменной на которую он указывает. Тогда если происходит изменения этого значения, то адресуемая указателем переменная изменится везде, где её видно и за пределами функции.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.09.2012, 17:25     Недопонимание указателей #24
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сигнатура объявления или заголовок функции:
Тип Имя ( Тип1 <Имя1>, Тип2 <Имя2>, Тип3 <Имя3>....);
В сигнатуре описания:
Тип Имя ( Тип1 Имя1, Тип2 Имя2, Тип3 Имя3....){}
Это не спроста, что здесь Имя1, Имя2, Имя3 должны быть указаны.
[занудство]
В определении функции тоже можно не именовать аргументы. Естессно, к анонимному параметру тогда (гарантированно и переносимо) достучаться нельзя, но передавать хоть что-то при вызове функции надо. Банальный пример: префиксный и постфиксный инкременты.
[/занудство]
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 18:26     Недопонимание указателей #25
Цитата Сообщение от ~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? Ну, наверное, не каждый компилятор будет выделять память под неиспользуемый параметр, но на деле то все выделяют.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.09.2012, 18:56     Недопонимание указателей #26
Цитата Сообщение от Герц Посмотреть сообщение
Имеешь в виду такое? А что тут может быть непереносимого кроме разных calling convention? Ну, наверное, не каждый компилятор будет выделять память под неиспользуемый параметр, но на деле то все выделяют.
Ага, именно это и именно из-за протоколов вызова. За компилятором же остаётся право не только вычислять аргументы в том порядке, в каком ему нравится, но и размещать их в памяти так, как ему нравится. То есть не факт, что они будут идти именно так, как в списке аргументов.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 19:01     Недопонимание указателей #27
VC++ compiler развращает своими __stdcall, __thiscall и т.п. :-)
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6442 / 3081 / 306
Регистрация: 04.12.2011
Сообщений: 8,485
Записей в блоге: 4
14.09.2012, 19:26     Недопонимание указателей #28
Цитата Сообщение от ~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
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.09.2012, 19:34     Недопонимание указателей #29
Да, у постфиксного инкремента/декремента приоритет выше. Но тут можно запутаться, поэтому лучше всегда ставить скобки. Например при префиксном инкременте/декременте если знак операции стоит слева от знака разыменования, то сначала будет получен объект, и потом к нему будет применена операция инкремента.
C++
1
2
3
++*g; //тут происходит операция инкремента объекта
*++g; //тут уже будет инкремент указателя
*g++; //ну а тут будет только инкремент указателя
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6442 / 3081 / 306
Регистрация: 04.12.2011
Сообщений: 8,485
Записей в блоге: 4
14.09.2012, 19:44     Недопонимание указателей #30
Цитата Сообщение от Toshkarik Посмотреть сообщение
C++
1
*g++; //ну а тут будет только инкремент указателя
Боюсь не только. После инкремента указателя, еще чтение по адресу в анонимную переменную. То есть, есть подозрение, что если много раз подряд, так сделать (непреднамеренно), в цикле например, то можно получить ошибку защиты. Или нет?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.09.2012, 19:48     Недопонимание указателей #31
IGPIGP, не ну это само собой. Я имел ввиду, что без скобок не инкрементировать значение, как это получается с префиксными.
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, есть подозрение, что если много раз подряд
По идеи и второго раза может быть достаточно.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6442 / 3081 / 306
Регистрация: 04.12.2011
Сообщений: 8,485
Записей в блоге: 4
14.09.2012, 20:02     Недопонимание указателей #32
Цитата Сообщение от Toshkarik Посмотреть сообщение
IGPIGP, не ну это само собой. Я имел ввиду, что без скобок не инкрементировать значение, как это получается с префиксными.
По идеи и второго раза может быть достаточно.
Еще забавнее, что если память для ситуации выделена "удачно" (закон бутерброда), то есть скажем, g указывает на элемент массива, то в этом случае не выходя за его пределы, получим логическую ошибку. Труд по исправлению такой кривизны, не стоит пары круглых скобок.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2012, 11:36     Недопонимание указателей
Еще ссылки по теме:

типы указателей - C++
Помогите понять, что от меня хотят в этом задании: &quot;выбрать данные из памяти с помощью разных типов указателей (float, char)&quot;

Сравнивание указателей - C++
Нужно подсчитать количество символов до определенной позиции, включительно, указатель на которую - begin_symbol начало подсчета с позиции...

Дереференс указателей - C++
после прочтения мануала появилась необходимость использовать beth = *ted; но оно выдает еррор C2100 =\ надо: есть size_t arg =...

Арифметика указателей - C++
есть size_t * pointer_1; logfile_f(&quot;\npointer_1 is 0x%X&quot;, pointer_1); есть size_t * pointer_2 = pointer_1 - 284; ...

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


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

Или воспользуйтесь поиском по форуму:
cmath
Модератор
2432 / 1651 / 133
Регистрация: 11.08.2012
Сообщений: 3,287
Завершенные тесты: 5
16.09.2012, 11:36     Недопонимание указателей #33

Не по теме:

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

Цитата Сообщение от 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
Так сойдет?
Yandex
Объявления
16.09.2012, 11:36     Недопонимание указателей
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru