Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/30: Рейтинг темы: голосов - 30, средняя оценка - 4.73
Заблокирован

Как грамотней писать объявление указателя?

24.09.2014, 13:11. Показов 6619. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ну собственно сабж.
C++
1
int* a;
или
C++
1
int *a;
Куда Фен Шуй рекомендует звёздочку ставить ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2014, 13:11
Ответы с готовыми решениями:

Как грамотней писать код?
Добрый день. 1. Как правильней перебирать контейнер (карта, хеш, список...) - обычным for(int = 0;...) или с использованием итераторов? ...

Как обратиться к полям структуры через указатель и объявление указателя на структуру
Как обратиться к полям структуры через указатель и объявление указателя на структуру? #include "stdAfx.h" #include...

Компилятор не принимает объявление указателя на функцию
Портирую библиотеку коннектора на си для tarantool. Код целиком тут. Туллчейн - cygwin - cmake - clion. При сборке возникает две...

55
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
24.09.2014, 13:24
Имхо второй вариант, поскольку в записи
C++
1
int* a,b;
Указателем будет только первое значение, второе - обычное целочисленное число. Такая запись может привести к путанице.
2
Заблокирован
24.09.2014, 13:34  [ТС]
Ок понял
0
24.09.2014, 13:40

Не по теме:

Так:

C++
1
std::unique_ptr<int> a(new int);

0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 14:28
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Куда Фен Шуй рекомендует звёздочку ставить ?
C++
1
int * a;
0
 Аватар для MakItSim
19 / 19 / 14
Регистрация: 23.09.2014
Сообщений: 117
24.09.2014, 14:33
Первый вариант.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
24.09.2014, 15:03
По сути, это вопрос вкуса и стиля.

Раньше, когда люди только-только переходили на С++ с Си, вроде как, было модно писать так:
C++
1
2
int* ptr;
// потому что, по логике, ptr - указатель на int
Позже стала более распространённой и популярной такая форма:
C++
1
2
int *ptr;
// по причине, указанной во втором посте
Сейчас всё более популярной становится такая форма:
C++
1
2
int * ptr;
// типа, компромиссный вариант
А вообще, можно хоть так писать:
C++
1
2
3
int*ptr;
// Компилятору по фигу куда Вы ставите звёздочку.
// Он всё равно пробелы в итоге все выкинет.
Ну и чтобы Ваш мир никогда не был прежним (обратите внимание на строки кода 33, 59, 76, 81).
На закуску, так сказать
2
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.09.2014, 15:43
gru74ik, лично я прижимаю влево
C++
1
2
3
4
5
int* a = new int(0);
int* const a = new int(1);
 
int a=0, b=0;
int* b; int* a;
Однако, нужно помнить, что звёздочка -- это модификатор переменной, а не типа. Так что рекомендую прижимать вправо новичкам.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
24.09.2014, 15:46
В любой приличной конторе существует "стандарт кодирования", в котором подробно описывается, куда "прижимать" звездочку, как располагать фигурные скобки, использовать ли Tab или пробелы, и прочая, прочая....
Вот принятому стандарту и следуй.
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.09.2014, 15:53
CheshireCat, и это верно.
Если есть корпоративные стандарты, то по стойке смирно выполняем требования.
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
24.09.2014, 16:32
Цитата Сообщение от mporro Посмотреть сообщение
Однако, нужно помнить, что звёздочка -- это модификатор переменной, а не типа. Так что рекомендую прижимать вправо новичкам.
Что?.. Почему это переменной?
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.09.2014, 16:54
Тамика, вот так.
C++
1
 int* var;
означает, что var будет типом после разыменования. А каким типом? Типом int.

Потому и запись
C++
1
 int* var, otherVar;
даёт вам один указатель и один int. Вы модифицируете переменную, а не тип.
0
24.09.2014, 16:58

Не по теме:

C++
1
2
3
typedef int* int_ptr;
 
int_ptr ptr1, ptr2, ptr3;
:)

0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
24.09.2014, 17:17
Цитата Сообщение от mporro Посмотреть сообщение
означает, что var будет типом после разыменования. А каким типом? Типом int.
Это тип - указатель. Это абсолютно отличный тип от int.
C++
1
int* var;
Означает, что var будет хранить адрес интовой переменной.
Попробуйте напишите так и запустите.
C++
1
2
3
4
5
6
7
int main()
{
    setlocale(LC_ALL, "Russian");
    int *p;
    *p = 100;
    system("pause>>null");
}
По Вашей теории всё верно должно быть. Создали указатель. Разыменовали. Присвоили значение. То есть, "превратили в инт". Но компилятор против.

Добавлено через 2 минуты
Цитата Сообщение от mporro Посмотреть сообщение
Потому и запись
Код C++
1
*int* var, otherVar;
даёт вам один указатель и один int.
А вот тут согласна.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.09.2014, 17:53

Не по теме:

Почему самые дельные советы помечены оффтопом?>:o



Добавлено через 48 секунд

Не по теме:

Не считая совета CheshireCat

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.09.2014, 18:02
Scrooge McDuck, вопрос где ставить звёздочку, это вопрос войны египтян с инопланетянами. Степень древности и холиварности примерно одинаковы. Зато тут каждый может выразить своё имхо. Я пишу int *a; исходя из того, что читать будут другие, а в большинстве литературных источников рекомендуют именно это. Тем не менее, для себя пишу int* a. Соображения от синтаксиса объявления в списке не кажутся мне достаточными. Объявления это же информация времени компиляции и список делает код компактнее. Зато объявив и инициализировав каждую переменную в отдельном утверждении и снабдив комментарием, это потом легче понять.
Синтаксис указателей пришёл из С и здорово напрягал создателя (С++)). Он даже подумывал над тем, чтобы в качестве альтернативы можно было писать: -> int a. Тогда бы это читалось слева-направо, а не как сейчас от середины-влево, а потом-таки направо. Но потом решил этого не делать.
С моей точки зрения, - чисто эстетической (я не тру-проггер)), имя переменной должно быть отдельно, а тип отдельно. То есть : int* a . Тогда и ссылка на указатель выглядит более вменяемо (имхо): int*& a. Ну то есть, опять-таки начинаем с середины (слева от имени за пробелом) читать и получаем:
& ссылка
int* на тип - указатель на целое
и вправо:
с именем a.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.09.2014, 19:11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я пишу int *a; исходя из того, что читать будут другие, а в большинстве литературных источников рекомендуют именно это.
Бог знает где вы это большинство нашли. Специально заглянул сейчас в Страуструпа, Александреску, Саттера и Джоссатиса - никто из них имя переменной не засоряет никакими звездочками, а Майерс посередине ставит. Или вы сишников имели в виду?
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.09.2014, 19:23
Моё мнение:
Я стараюсь не писать конструкции вида:
C++
1
int * a, b;
т.к. это может ввести в заблуждение и меня, и других. Пусть объявление каждого указателя будет на своей строке, а где будет находится звёздочка дело вкуса каждого. Лично я ставлю звёздочку через пробел от типа, и объявление каждого указателя у меня находится на своей строке.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.09.2014, 19:45
Цитата Сообщение от castaway Посмотреть сообщение
Я стараюсь не писать конструкции вида:
Код C++
1
int * a, b;
т.к. это может ввести в заблуждение и меня, и других.
Да в С++, по-моему, никто так не пишет. Это сишники любят строчки поэкономить.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.09.2014, 19:53
Mr.X, я думаю это не от языка зависит, а от человека.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2014, 19:53
Помогаю со студенческими работами здесь

Объявление указателя на структуру в объявлении структуры
struct node { int data; struct node * next; }; Зачем может понадобится такое объявление?

Объясните объявление указателя на объект класса
Доброго времени суток! Подскажите, пожалуйста, что означает данная строчка? B *b; B - это класс. *b - указатель....

Рекурсивный include, как грамотней сделать?
Привет! Что - то я совсем онубел :D Есть два класса, вот их хэдэры: //Base.h #pragma once #include &quot;Child.h&quot; class...

Как наиболее красиво писать объявление функций?
Допустим, функция возвращает 3 аргумента. def make_smth(): return a, b, c А другая функция принимает эти 3 аргумента: def...

Объявление глобального указателя всего проекта
Здравствуйте! Программа состоит из нескольких модулей. В одном из модулей написан класс, объект которого используется в других модулях. Как...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru