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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> константный указатель 
:(
    Опции темы
GrafF812
Дата 21.3.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подскажите пожалуйста вот по какому вопросу. В документации по C++ сказано, что при передаче массива в функцию - он(массив) по умолчанию передается как константный указатель, т.е int * const. Вот пример:
Код


#include "stdafx.h"

void f(int[]);

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1,2,2};
    f(a);

    return 0;
}

void f(int a[])
{
    a++;
}


Вопрос: почему я могу изменить адрес указателя а в функции f ?
PM MAIL   Вверх
borisbn
Дата 21.3.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GrafF812 @  21.3.2010,  14:14 Найти цитируемый пост)
В документации по C++ сказано

1. Где? Я специально просмотрел стандарт и не нашел. Может, конечно, плохо искал - тогда подскажите, пожалуйста, в каком разделе.
2. Какой у Вас компилятор? Если VC, то у него не всегда соблюдаются правила


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
djamshud
Дата 21.3.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



В f а - это другая переменная, которая ассоциирована с тем же массивом, но изменяя ее вы не меняете исходный массив. Распечатайте после f(a) значение *a и убедитесь.

Надеюсь вы запуталсиь в моем объяснении и впредь будете давать чуть более вменяемые названия переменным и функциям.


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


Опытный
**


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

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



Цитата(GrafF812 @  21.3.2010,  14:14 Найти цитируемый пост)
 В документации по C++ сказано, что при передаче массива в функцию - он(массив) по умолчанию передается как константный указатель, т.е int * const

Вы просто не доконца поняли документации. Имеется ввиду, что указатель в теле программы _tmain не будет менятся при измене указателя в f(). А с указателем a в f() вы вольны делать что угодно. В документации было написано int * const?


Цитата(djamshud @  21.3.2010,  18:05 Найти цитируемый пост)
В f а - это другая переменная, которая ассоциирована с тем же массивом, но изменяя ее вы не меняете исходный массив. Распечатайте после f(a) значение *a и убедитесь.

В документации написано  smile , что массивы передаются через указатель, а следовательно исходный массив изменяется, так как a в f - указатель на массив

Цитата(borisbn @  21.3.2010,  17:15 Найти цитируемый пост)
 Какой у Вас компилятор? Если VC, то у него не всегда соблюдаются правила 

VC идет по стандарту. Кто вам такими глупостями мозги пудрит?

PS
И вообще "по умолчанию передается как константный указатель" меня пугает. Куда по умолчанию? програмист сам задает как принимать и как отдавать. ИМХО утверждение некорректно

Это сообщение отредактировал(а) sQu1rr - 21.3.2010, 20:17
PM MAIL Skype GTalk   Вверх
GrafF812
Дата 21.3.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(djamshud @  21.3.2010,  18:05 Найти цитируемый пост)
но изменяя ее вы не меняете исходный массив

жжете товарищь  smile 
Код

#include "stdafx.h"
#include <iostream>
void f(int[]);
int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1,2,3};
    f(a);

    std::cout<<a[0]<<std::endl;    // выводит 100
    std::cout<<a[1]<<std::endl;
    std::cout<<a[2]<<std::endl;

    return 0;
}
void f(int a[])
{
    *a = 100;
}


borisbn, Дейтел - Как программировать на С++
user posted image

компилятор VS 2008.
PM MAIL   Вверх
zim22
Дата 21.3.2010, 20:15 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(GrafF812 @  21.3.2010,  13:14 Найти цитируемый пост)
Вопрос: почему я могу изменить адрес указателя а в функции f ?

вопрос на вопрос: а ты изменяешь адрес локального указателя или переданного в функцию?
т.е. после выхода из функции изменится ли адрес начала массива? я думаю, что нет smile


--------------------
PM MAIL   Вверх
sQu1rr
Дата 21.3.2010, 20:19 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GrafF812 @  21.3.2010,  20:15 Найти цитируемый пост)
borisbn, Дейтел - Как программировать на С++

Заметьте - там ничего не написано про функции!
PM MAIL Skype GTalk   Вверх
borisbn
Дата 21.3.2010, 21:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(sQu1rr @  21.3.2010,  20:06 Найти цитируемый пост)
VC идет по стандарту. Кто вам такими глупостями мозги пудрит?

во-первых, потрудитесь выражаться не как на базаре.
во-вторых, не МНЕ "пудрят", а Я сам проверял. Например: 
1. подчеркивание при декорировании в именах функций
2. перестановка перегруженных функций в виртуальной таблице
Код

virtual void foo() = 0;
virtual void foo( int x ) = 0;

будет скомпилено так:
Код

virtual void foo( int x ) = 0;
virtual void foo() = 0;

3. выравнивание на 8 байт не выравнивает vf_ptr
и много ещё


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
djamshud
Дата 22.3.2010, 00:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



>жжете товарищь

Учитесь читать прежде чем писать. И думать тоже. Что писал я:
>это другая переменная, которая ассоциирована с тем же массивом, но изменяя ее вы не меняете исходный массив

Что написалы вы:
>*a = 100;

И теперь особая, компутерная, магия: вы изменили не переменную ${ассоциацию с массивом}, а сам массив, не тронув при этом переменную. А вот
>a++
это изменение переменной.

На пересдачу!


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(GrafF812 @  21.3.2010,  14:14 Найти цитируемый пост)
В документации по C++ сказано, что при передаче массива в функцию - он(массив) по умолчанию передается как константный указатель, т.е int * const.
Документация по С++ это не книжка Дейтейлов, а стандарт ANSI ISO IEC 14882/1998. Вот ссылаться на него и надо бы.
На самом деле, в этой книжке имеется в виду, что массив может свободно конвертироваться в описанный выше указатель. Более того, если функция будет принимать указатель на void, то массив тоже к нему сконвертируется, при этом не важно, массивом каких элементов он был.

PM   Вверх
GrafF812
Дата 22.3.2010, 00:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



djamshud
Цитата(djamshud @  21.3.2010,  18:05 Найти цитируемый пост)
Распечатайте после f(a) значение *a и убедитесь.


ее и печатаю:

Цитата(GrafF812 @  21.3.2010,  20:15 Найти цитируемый пост)
  std::cout<<a[0]<<std::endl;    // выводит 100


Добавлено через 4 минуты и 51 секунду
Цитата(djamshud @  22.3.2010,  00:09 Найти цитируемый пост)
А вот
>a++
это изменение переменной.
 это изменение адреса, вам на пересдачу   smile 

PM MAIL   Вверх
djamshud
Дата 22.3.2010, 00:42 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



GrafF812, вы наркоман штоле? После того, как записали в него сто, было бы удивительно увидеть что-то другое. Прошу заметить, что совет распечатать *a был дан относительно стартового сообщения, а не в попытке угадать ваш последующий ответ мне.

Добавлено через 11 минут и 40 секунд
>это изменение адреса

Кэп чуть чаем не поперхнулся. Но он сегодня в настроении и даст разъяснение: адрес - значение переменной, его изменение = изменение переменной. Изменение же данных по адресу, на который ссылается переменная, ни разу не изменение самой переменной. Я понимаю, что вы этого уяснить не можите, но не понимаю, зачем перечите.

>вам на пересдачу

Подумайте еще раз. Не приму же! :)


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


Опытный
**


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

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



Цитата(borisbn @  21.3.2010,  21:34 Найти цитируемый пост)
а Я сам проверял. Например: 

Проверять не буду, поверю на слово. Но такие тонкости лично меня не волнуют. Исправлюсь: VC++ удовлетворяет стандарт.


Цитата(borisbn @  21.3.2010,  21:34 Найти цитируемый пост)
во-первых, потрудитесь выражаться не как на базаре.

Я выражаюсь как на форуме, потрудитесь уважать мою лень строить умные фразы   smile 


Цитата(djamshud @  21.3.2010,  18:05 Найти цитируемый пост)
но изменяя ее вы не меняете исходный массив

GrafF812 имел ввиду это вашу опечатку, так что все таки вам на пересдачу, либо курсы работы над ошибками

PS
1 цитата: какой акцент на личном миестоимении  smile 

Это сообщение отредактировал(а) sQu1rr - 22.3.2010, 21:49
PM MAIL Skype GTalk   Вверх
djamshud
Дата 22.3.2010, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



>VC++ удовлетворяет стандарт.

Стандарту плевать на VC++, а вот разработчиков она часто не удовлетворяет. Вам перечислили далеко не все тонкости, где студия ведет себя как дилда. И из этих многих крошечных моментиков складывается каша.

>GrafF812 имел ввиду это вашу опечатку

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


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


uploading...
****


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

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



Цитата(sQu1rr @  21.3.2010,  20:06 Найти цитируемый пост)
VC идет по стандарту

 smile 
Кто вам такими глупостями мозги пудрит?

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

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

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

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

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


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

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


 




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


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

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