8 / 7 / 1
Регистрация: 25.12.2019
Сообщений: 321
1

Указатели, адрес переменной

01.03.2020, 09:21. Показов 10971. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
int main(коллеги!)
Снова прошу меня поправить!
Есть такой пример:
C++
1
2
3
4
5
6
7
8
9
 int *ptr;           // переменная - ptr, указывает на - int значение (*ptr - это указатель на значение - int)
 
 int total = 3200;   // обычная "интовая" переменная - total, получает значение 3200
 
 ptr = &total;       // переменная - ptr получает адрес переменной - total  (в переменную - ptr, помещается адрес переменной - total)
 
 int val = *ptr;     // а здесь наоборот, из адреса хранящегося в - ptr, получаем значение и присваиваем его переменной - val
                     // то есть теперь переменные total и val содержат одинаковые значения = 3200
                     /// переменная - ptr, нужна была для записи и хранения адреса переменной - total
Я его подробно закоментировал как сам понимаю, то есть дополнил комент из книги...
Но первая строчка - int *ptr; не вполне понятна
как я это понимаю, что переменная - ptr интовая! только и всего!
Правильно?

Можно записать все вот так:
C++
1
2
3
4
5
 int total = 3200;   
 
 int *ptr = &total;    // ну то есть, объявляем интовый указатель - *ptr  ?????????????
 
 int val = *ptr;
Добавлено через 2 минуты
Ну если совсем примитивно то так:

int *ptr - указатель с типом - int
int ptr - переменная с типом - int
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2020, 09:21
Ответы с готовыми решениями:

Массивы и Указатели: распечатать таблицу,содержащую имя переменной,ее значение и адрес
Условие:Написать программу,которая создает несколько переменных целого и вещественного типа,для...

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны.
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив -...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; ...

Создать две переменных, ввести их с клавиатуры. Вывести строки: имя переменной - адрес переменной - значение п
Создать две переменных, ввести их с клавиатуры. Вывести строки: имя переменной - адрес переменной...

42
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
01.03.2020, 12:21 21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Annemesski Посмотреть сообщение
Там же, по вашей ссылке, для clang этот код работает без вылетов.
Это не дает оснований утверждать, что этот код дает определенный результат. Может вывести мусор, может вылететь, undefined behaviour.

Цитата Сообщение от Annemesski Посмотреть сообщение
выделяет память только в момент определения
А память вообще здесь никто не выделяет(без new и malloc). Определение типа ptr_a = &a; присваивает ptr_a значение адреса a, память уже должна быть выделена.
1
2509 / 1232 / 455
Регистрация: 08.11.2016
Сообщений: 3,372
01.03.2020, 12:32 22
Цитата Сообщение от IGPIGP Посмотреть сообщение
Без компьютера оно не бывает
Правда...
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почитайте про инициаплизаию по умолчанию в С++.
Ну да, глобальные переменные инициализируются нулем.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это вы откуда берёте?
Уел... давненько я стандартов не читал...

Добавлено через 5 минут
Цитата Сообщение от elenayagubova Посмотреть сообщение
undefined behaviour.
Выходит так.
Цитата Сообщение от elenayagubova Посмотреть сообщение
присваивает ptr_a значение адреса a, память уже должна быть выделена.
все... пойду просплюсь...
1
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.03.2020, 12:51 23
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Но первая строчка - int *ptr; не вполне понятна
как я это понимаю, что переменная - ptr интовая! только и всего!
пиши вот так: int* ptr
тобишь, пиши int и звёздочку слитно

звездочка - неотъемлемая часть типа.
это - не int, это - int*

int* никак не может быть только интовой,
потому что уже со звездочкой.

Цитата Сообщение от R_U_S_V Посмотреть сообщение
ptr = &total;
а вот здесь амперсанд & относится к имени total.
это - операция взятия адреса у переменной total
поэтому логично писать &total слитно


Цитата Сообщение от R_U_S_V Посмотреть сообщение
int *ptr = &total;    // ну то есть, объявляем интовый указатель - *ptr  ?????????????
тебя сбивает с толку звездочка, которую какой балбес записал рядом с именем.

просто возьми себе за правило:
если закорючка (апмперсанд или звездочка) относится к типу - пиши её слитно с типом
и тогда сразу понятно, что закорючка - часть типа, а не имени.
если пишешь слитно с именем - значит выполняется операция над именем.

C++
1
2
3
4
5
int* ptr; // звездочка рядом с int - значит часть типа
 
*ptr; // звездочка рядом с именем, значит разыменовывание
 
v1 * v2; // звездочка отдельно от имён, значит это умножение
и тогда мир сразу станет проще.
1
8 / 7 / 1
Регистрация: 25.12.2019
Сообщений: 321
01.03.2020, 15:35  [ТС] 24
Цитата Сообщение от hoggy Посмотреть сообщение
тебя сбивает с толку звездочка, которую какой балбес записал рядом с именем.
Имя "балбеса" походу Шилдт.
Указатели, адрес переменной

Либо того кто редактировал код книги...
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
01.03.2020, 15:45 25
Вот в этом случае:
C++
1
int *a, *b;
b - указатель
А в этом
C++
1
int *a, b;
b - обычный int, не указатель
Так что написание звездочки рядом с именем имеет смысл (т.к. звездочка в данном случае делает указателем конкретную переменную)
2
8 / 7 / 1
Регистрация: 25.12.2019
Сообщений: 321
01.03.2020, 15:52  [ТС] 26
Цитата Сообщение от hoggy Посмотреть сообщение
пиши вот так: int* ptr
тобишь, пиши int и звёздочку слитно
звездочка - неотъемлемая часть типа.
это - не int, это - int*

Цитата Сообщение от elenayagubova Посмотреть сообщение
Вот в этом случае:
C++Выделить код
1
int *a, *b;
b - указатель
А в этом
C++Выделить код
1
int *a, b;
b - обычный int, не указатель
Так что написание звездочки рядом с именем имеет смысл (т.к. звездочка в данном случае делает указателем конкретную переменную)
АААААААА .....
Что происходит????
0
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.03.2020, 15:54 27
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Имя "балбеса" походу Шилдт.
Герб не при чем. Я лично, тоже не понимал почему нужно отделять тип значения от символа ссылки или указателя. Это делают для того, чтобы не ошибаться при объявлениях в списках:
C++
1
int* a, b, c ;
это аналогично объявлениям
C++
1
2
3
int* a;
int  b;
int  c ;
это потому, что составной тип указателя/ссылки не указывается как единое имя, которое распространяется на всё что после него. Только первый получает наследство. Скажем, модификаторы типа такие как unsigned действуют совершенно иначе.

C++
1
int unsigned a, b, c ;
это аналогично объявлениям
C++
1
2
3
int unsigned   a;
int unsigned   b;
int unsigned   c ;
поэтому, чтобы не обмануться пишут:
C++
1
int *a, *b, *c, d, *e ;
это аналогично объявлениям
C++
1
2
3
4
5
int *a;
int  *b;
int  *c ;
int   d;/////
int *e;
Герб это то, что не всегда красиво, но всегда достойно уважения. Имхо)
1
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.03.2020, 15:54 28
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Имя "балбеса" походу Шилдт.
никогда не ведись на авторитетов.

ты можешь использовать стиль, который облегчает жизнь.
или не использовать - выбор за тобой.

Цитата Сообщение от elenayagubova Посмотреть сообщение
Вот в этом случае:
int *a, *b;
а вот в этом случае:
C++
1
int(**( void(int) ))[5]
большинство программистов вообще сходу не могут понять, что это за тип,
и где должно размещаться имя переменной.

хорошая новость в том,
что подобный говнокод запрещен регламентом большинства компаний.
да и люди в массе своей адекватные.
и понимают, почему писать вот так: int *a, *b; - плохая идея.
1
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.03.2020, 15:57 29
Цитата Сообщение от R_U_S_V Посмотреть сообщение
АААААААА .....
Что происходит????
Это вы в мире ЯП. Добро пожаловать. Тут много названий и идей не соответствуют здоровой логике. Терпение уместно.
1
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.03.2020, 15:59 30
Цитата Сообщение от IGPIGP Посмотреть сообщение
чтобы не обмануться пишут:
именно что бы не обмануться, нормальные люди и пишут вот так:
Цитата Сообщение от IGPIGP Посмотреть сообщение
int* a;
int  b;
int  c ;
и что бы нормальные люди ничайно не забыли о том, что они - нормальные,
в нормальных компаниях на уровне регламента запрещено писать всякий однострочный говнокод
1
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.03.2020, 16:05 31
R_U_S_V, беда этого поста в том, что он имеет актуальное (для новичков это БОЛЬ!) и ясное название. Поэтому, не суждено ему стать полезным.
Помните?
Троллинг троллингу летит,
Троллинг, троллингу кричит,
Троллинг, где б нам пообедать?
Как бы нам о том проведать?

Теперь легче книжки по перелистывать, чем загуглить и найти легкий и простой материал.

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
в нормальных компаниях на уровне регламента запрещено писать всякий однострочный говнокод
в нормальных компаниях запрещено называть балбесами тех, кто этого не заслуживает. Я обо всем написал. Пишите, что хотите, - развлекайтесь)
А тому же Шилдту всё едино. Его ругают даже те, кто и не читал толком. Но его знают и уважают.
1
18472 / 9629 / 2356
Регистрация: 30.01.2014
Сообщений: 16,882
01.03.2020, 16:07 32
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Что происходит????
Синтаксис и семантика.

С точки зрения синтаксиса, звездочка в записи
C++
1
int * p, * p1;
относится к имени переменной.

С точки зрения семантики - к имени типа.

Поэтому оба ответа правильные. Вопрос лишь в том, что выбирать за главное.

У нас, например, вообще никуда звездочку не прижимают. Ни к имени переменной, ни к имени типа.

Да, с замечанием про однострочное объявление нескольких переменных лично я согласен. Лучше так не писать.
1
8 / 7 / 1
Регистрация: 25.12.2019
Сообщений: 321
01.03.2020, 16:10  [ТС] 33
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, с замечанием про однострочное объявление нескольких переменных лично я согласен. Лучше так не писать.
Лучше так:
int a;
int b;
int c;

чем так
int a, b, c;

Блин, а я то наоборот все старался как-то кол-во строчек сокращать! Но в пределах разума конечно, что прочесть можно было...
0
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.03.2020, 16:18 34
Цитата Сообщение от DrOffset Посмотреть сообщение
У нас, например, вообще никуда звездочку не прижимают. Ни к имени переменной, ни к имени типа.
мне это картинку напоминило:
Указатели, адрес переменной


Цитата Сообщение от IGPIGP Посмотреть сообщение
int* a, b, c ;
Указатели, адрес переменной
1
18472 / 9629 / 2356
Регистрация: 30.01.2014
Сообщений: 16,882
01.03.2020, 16:23 35
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Блин, а я то наоборот все старался как-то кол-во строчек сокращать!
Понятность кода на первом месте должна быть.
Синтаксис С позволяет не особо напрягаясь превратить программу нечитаемое месиво.
Поэтому несколько искусственных правил для предотвращения этого было бы уместно ввести.

Собственно, сборник таких правил для C++ существует - называется Cpp Core Guidelines.
Вот ссылка на обсуждаемое правило: https://isocpp.github.io/CppCo... s-name-one

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
мне это картинку напоминило
Аналогии, как правило, ложны, даже если они такие яркие.
По существу же вопроса: мы провели общее голосование и коллегиально решили не прижимать. С тех пор никого это не напрягает. А новички быстро перестраиваются.
1
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.03.2020, 16:28 36
Цитата Сообщение от DrOffset Посмотреть сообщение
мы провели общее голосование и коллегиально решили не прижимать
даже предполагать не берусь,
почему вы выбрали самый стрёмный вариант:
ни рыба, ни мясо.
1
18472 / 9629 / 2356
Регистрация: 30.01.2014
Сообщений: 16,882
01.03.2020, 16:35 37
Цитата Сообщение от hoggy Посмотреть сообщение
ни рыба, ни мясо
Именно поэтому и выбрали. Чтобы не развивать условный рефлекс. Благодаря этому решению все теперь спокойно читают любой код, как с прижатой вправо звездочкой, так и с прижатой влево. И ни у кого не возникает желания исправить это. Потому что понимание происходящего в коде не завязано на форму представления.
1
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.03.2020, 16:35 38
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Блин, а я то наоборот все старался как-то кол-во строчек сокращать! Но в пределах разума конечно, что прочесть можно было...
Конечно, лучше читается запись в столбик. И каждую можно прокомментировать. Но так делается не всегда. И далеко не везде запрещено писать объявления в списке.
Вот надуманный пример, но это лишь напоминание о том, что объявления можно делать и в областях объявлений различных операторов:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main()
{
int a[7]={1,2,3,4,5,6,7} ;
 for(int sum=0, *start=a; start<a+7 ; sum+=*start, ++start)
    {
        cout<<sum<<endl;
    }
return 0;
}

Не по теме:

хана топику, - пойду я)

1
8 / 7 / 1
Регистрация: 25.12.2019
Сообщений: 321
01.03.2020, 16:41  [ТС] 39
Цитата Сообщение от IGPIGP Посмотреть сообщение
хана топику, - пойду я)
Хорошо, тока жду Вас снова, ведь помощи понадобится мноооого!
0
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.03.2020, 16:50 40
Цитата Сообщение от DrOffset Посмотреть сообщение
все теперь спокойно читают любой код
по моим наблюдениям, люди свободно читают любой код,
потому что у них уже есть соответствующий опыт (квалификация).
а не потому, что следуют бесхребетному регламенту.

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

Цитата Сообщение от DrOffset Посмотреть сообщение
понимание происходящего в коде не завязано на форму представления.
печально, чоу.

code-style для того и существует:
что бы улучшать (вплоть до автоматических реакций мозга) понимание происходящего в коде.

у вас же, с таким же успехом можно вообще отказаться от code-style,
и писать как кому заблогарасудиццо.
0
01.03.2020, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2020, 16:50
Помогаю со студенческими работами здесь

Указатели в с++ указывают только на адрес?
Например указатель int *p; Он может инициализироваться только адресом?(и ничем другим) например...

Указатели и ссылки. Как сохранить адрес?
Небольшая путаница с указателями и ссылками. Допустим,есть некий указатель p1, который указывает...

Указатели в переменной!!!
Указатели в переменной используються только для просмотра адреса? int *a;

взять адрес переменной
если &amp; стоит перед переменной, то это читается как - &quot; взять адрес этой переменной&quot; а если он...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru