Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разница между int* i; и int *i; 
:(
    Опции темы
greengarlic
Дата 7.6.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.4.2010

Репутация: нет
Всего: нет



Всем привет,

есть какая то принципиальная разница между вот такими объявлениями:

Код

int* i;
int *i;

 
а то в разных примерах поразному пишут.
PM MAIL   Вверх
djamshud
Дата 7.6.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Нет разницы.

//int *i - удобнее :)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Dem_max
Дата 7.6.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



разница в понимании кто есть указатель.
А в правильном понимании это int *i; ибо указателем является i на тип int



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
greengarlic
Дата 7.6.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.4.2010

Репутация: нет
Всего: нет



djamshud, 
Dem_max, 
 Спасибо за ответы!
PM MAIL   Вверх
kemiisto
Дата 7.6.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Мне удобнее так: тип данных, пробел, идентификатор. Я воспринимаю указатель как отдельный тип данных, поэтому всегда пишу:
Код
int* i;


Это сообщение отредактировал(а) kemiisto - 7.6.2010, 19:58


--------------------
PM MAIL WWW GTalk Jabber   Вверх
djamshud
Дата 7.6.2010, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Указатель - это не тип данных.
Код

int* i,j;

как бы намекают.

То есть формально его называют типом данных, но по сути это нечто обособленное.

Это сообщение отредактировал(а) djamshud - 7.6.2010, 20:08


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
kemiisto
Дата 7.6.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



djamshud, я каждую переменную на новой строке объявляю. Никаких проблем.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
NightmareZ
Дата 7.6.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 0
Всего: 13



Цитата(greengarlic @  7.6.2010,  18:58 Найти цитируемый пост)
а то в разных примерах поразному пишут.

В языках С и C++ звёздочка будет относиться только к первой переменной:
Код

int * i, j; // объявляем переменную i типа int* и переменную j типа int

Поэтому, я считаю, правильнее писать звёздочку слитно с именем переменной (хотя синтаксически разницы никакой).

В C# же звёздочка будет относиться к типу:
Код

int * i, j; // объявляем переменную i типа int* и переменную j типа int*

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


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
ИванМ
Дата 7.6.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



У меня лично привычка если после типа одна переменная, пишу
int* n;
Если больше, то
int *n, m, *p;
PM MAIL   Вверх
Dem_max
Дата 8.6.2010, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



NightmareZ,  кстати подметил, я думал на этом акцентировать внимание. Многие новички ошибаются когда пишут так:
int* i, j, k;
в итоге они думают что j,k - это указатель, хотя указателем является лишь i.
Некоторые индивиды пишут наверное так:
Код

int* i;
int* j;
int* k;
int* l;
int* m;
или так
int* i,* j,* k,* l,* m;

Правда не красиво ? чем так: 
Код

int *i, *j, *k, *l, *m;


Цитата

Я воспринимаю указатель как отдельный тип данных

Еще одно заблуждение считать указатель типом данных. Хотя бы потому что указатель это указатель и это адресация на участок памяти, правда если память выделена и указателю присвоен адрес на участок памяти.

Что такое память это массив байт. Собственно указатель указывает на массив байт и не на что иное,  собственно строка int* i; говорит компилятору что есть указатель на массив байт в памяти, но этот массив нужно интерпретировать как тип int и работать с данными как с типом int.
Собственно почему указатель не может быть отдельным типом данных, ды кпотому что массив байт можно привести к разным типам (!!! все но не во все, это отдельная тема). Собственно пример:
 
Код

unsigned char *massiv;
massiv = new unsigned char[200];


Теперь massiv указывает на область памяти из 200 байт. И компилятор работает с типом BYTE (unsigned char), легким движением руки мы может трактовать эту область памяти как тип int

Код

unsigned char *massiv;
massiv = new unsigned char[200];
massiv[0] = 0xff;
massiv[1] = 0x01;
massiv[2] = 0x00;
massiv[3] = 0x00;
massiv[4] = 0x00;
massiv[5] = 0x00;
massiv[6] = 0x00;
massiv[7] = 0x00;

int *mas;
mas = (int *)massiv;


Собственно вопрос чему равен mas[0] и mas[1] ? (загадка для заблуждающихся и новичков)

Если ответите то собственно поймете почему ниже следующее высказывание, глупо.
Цитата

Я воспринимаю указатель как отдельный тип данных


Это сообщение отредактировал(а) Dem_max - 8.6.2010, 05:33


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 8.6.2010, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dem_max @  8.6.2010,  04:31 Найти цитируемый пост)
Еще одно заблуждение считать указатель типом данных. Хотя бы потому что указатель это указатель и это адресация на участок памяти, правда если память выделена и указателю присвоен адрес на участок памяти.

а значение адреса  (пусть даже нулевое) это не _данные_ ?!  smile 



--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 8.6.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

это не _данные_ ?! 


Это данные "тирэ" адрес.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
djamshud
Дата 8.6.2010, 11:59 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
kemiisto
Дата 8.6.2010, 12:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(Dem_max @  8.6.2010,  06:31 Найти цитируемый пост)
Еще одно заблуждение считать указатель типом данных.

Что ты говоришь? Открываем стандарт (я взял для примера мартовский черновик 0x), переходим к пункту 8.3.1 и читаем:
Цитата

1 In a declaration T D where D has the form 
* attribute-specifieropt cv-qualifier-seqopt D1 
and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T,” then the type of the 
identifier of D is
 “derived-declarator-type-list cv-qualifier-seq pointer to T.” The cv-qualifier s apply to the pointer 
and not to the ob ject pointed to. Similarly, the optional attribute-specifier (7.6.1) appertains to the pointer 
and not to the ob ject pointed to.


Вы же так любите стандарты... smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.