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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача массива по ссылке, как передать массив в функцию по ссылке 
:(
    Опции темы
Fazil6
Дата 1.4.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Xenon @  1.4.2007,  22:11 Найти цитируемый пост)
Получается не вполне корректно называть arr констатным указателем?

почему? 
PM MAIL   Вверх
sisbkoshup
Дата 1.4.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(apook @ 1.4.2007,  21:43)
Можно производить следующие операции с указателями:
1. Присваивание значения указателя другому указателю того же типа
2. Сложение и вычитание указателя и целого
3. Вычитание и сравнение двух указателей, указывающих на элементы одн
   ого и того же массива,
4. Присваивание указателю нуля и сравнение указателя с нулем.

Других операций с указателями производить не допускается!

Нельзя складывать два указателя, перемножать их,  делить,  сдвигать,
выделять разряды;
указатель нельзя складывать со значением типа float или double;
указателю одного типа нельзя даже присвоить указатель другого  типа,
не выполнив предварительно операции приведения ( исключение составл
яют лишь указатели типа void * ). 

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

______________

 smile

Добавлено через 4 минуты и 9 секунд
Цитата(Xenon @ 1.4.2007,  22:25)
sisbkoshup, просто такое неявное преобразование массива в указатель при вызове функции приводит к потере размера массива, значит не совсем одно и тоже ...

Размер передать вторым параметром! Как это все и делают!!!



____________


 smile 

Это сообщение отредактировал(а) sisbkoshup - 1.4.2007, 22:26
PM MAIL   Вверх
BreakPointMAN
Дата 1.4.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sisbkoshup @  1.4.2007,  23:25 Найти цитируемый пост)
Два указателя одного типа можно, и нужно, складывать и вычитать, результатом будет целое!

Вычитать можно (и то надо делать с умом), складывать - нет. Кури умные книжки.
PS: массив не есть указатель, имя массива может в ряде случаев рассматриваться как константный указатель на его первый элемент, но не более того. И физически это отнюдь не одно и то же. На RSDN этой теме даже несколько вопросов из FAQ посвящено: 


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Xenon
Дата 1.4.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



sisbkoshup, при чем тут это. Мы говорим что это не одно и тоже, а ты вообще о другом чем-то. BreakPointMAN уже привел достаточно ссылок убедительных + Страуструпа надо читать, хотя он там об этом как-то вскользь пишет, хотя даже из "неявное преобразование" можно понять, что это не одно и тоже.


--------------------
user posted image  
PM MAIL   Вверх
JAnty
  Дата 2.4.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А ссылка на объект чем отличается от указателя?


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
apook
Дата 2.4.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

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

 smile  smile  smile 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
JAnty
  Дата 2.4.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

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

 smile 
Значит:
Код

int x;
int &a = x; /* не равно */ int *b = &x;


Будем считать, что я понял. smile 


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
zkv
Дата 11.6.2007, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



всплыл этот вопрос.
Возможно ли создать полноценную ссылку на массив, чтобы и sizeof правильно работал, и в функцию ее можно было передать?
Код

int A = 1;
int &rA = A;

int ARR [2][2];
//ссылка на ARR возможна?

PM MAIL   Вверх
apook
Дата 11.6.2007, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Возможно ли создать полноценную ссылку на массив, чтобы и sizeof правильно работал, и в функцию ее можно было передать?

Я так понимаю что не возможно такое
а еще вот  то что в функции sizeof-ом не получается воспользоваться, он возвращает
размер указателя тож неприятность


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Voldemar2004
Дата 11.6.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(sisbkoshup @  1.4.2007,  22:09 Найти цитируемый пост)
Имя массива и есть ссылка на первый элемент!


Цитата(BreakPointMAN @  1.4.2007,  22:16 Найти цитируемый пост)
Кто тебе сказал такую глупость?


А как же это:
Цитата
Связь между указателями и массивами

В языке Си массивы и указатели тесно связаны. Имя каждого массива может рассматриваться как указатель на первый элемент массива.
  smile  Взято отсюда 

Я и вдругих книгах читал про это - у Крупника, например, "Язык Си".

Добавлено через 8 минут и 10 секунд
Наверно имелось в виду, что имя массива - это указатель на его первый элемент, а не ссылка ?


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
zkv
Дата 11.6.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Voldemar2004, только не надо снова подымать эту тему, целая война была, может вернемся к вопросу:
Цитата(zkv @  11.6.2007,  06:22 Найти цитируемый пост)
Возможно ли создать полноценную ссылку на массив, чтобы и sizeof правильно работал, и в функцию ее можно было передать?


попробую пояснить подробнее:
Код

//с простыми типами делается так:
int A = 1;
int B = 2;
int &rInt;
if( ... )
  rInt = A;
else
  rInt = B;

//а ка провернуть с массивом?
int ARR_A [2][2];
int ARR_B [2][2];
//как объявить rARR?
if( ... )
  rARR = ARR_A;
else
  rrARR = ARR_B ;


если такую ссылку создать невозможно, то почему?
PM MAIL   Вверх
Daevaorn
Дата 11.6.2007, 13:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(zkv @  11.6.2007,  13:51 Найти цитируемый пост)
//с простыми типами делается так:

так нельзя. ссылка должна быть инициализирована сразу.
Цитата(zkv @  11.6.2007,  13:51 Найти цитируемый пост)
//а ка провернуть с массивом?

никак. язык такие конструкции не поддерживает.
PM MAIL WWW   Вверх
zkv
Дата 11.6.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Daevaorn @  11.6.2007,  13:02 Найти цитируемый пост)
так нельзя. ссылка должна быть инициализирована сразу.

да, наврал немного, ну не суть, пусть будет так:
Код

int A = 1;
int B = 2;
int &rInt = A;
if( ... )
  rInt = A;
else
  rInt = B;

Цитата(Daevaorn @  11.6.2007,  13:02 Найти цитируемый пост)
никак. язык такие конструкции не поддерживает. 

спасибо, верю на слово smile
PM MAIL   Вверх
Fazil6
Дата 11.6.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(zkv @  11.6.2007,  12:51 Найти цитируемый пост)
если такую ссылку создать невозможно, то почему?


Код

#include <stdio.h>

template<typename T , typename A>
void farr(T &as, const A x)
{
    printf("\nSize = %d" , sizeof(as)/sizeof(A));
}


int main()
{

    int arr[123];
    farr(arr, arr[0]);
}




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


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

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



Да, что ни говори, шаблоны - сила. Никому за C++ templates не угнаться. Для тех, кто их не любит, предлагается куда менее изящный вариант:
Код
#include <cstdlib>
#include <cassert>

const size_t ROWS = 2;
const size_t COLS = 2;

int sizeOfGivenArr( int (& refArrParam)[ROWS][COLS] ) {
    return sizeof(refArrParam) / sizeof(*refArrParam);
}

int main() {
    int arr [ROWS][COLS] = { 1, 2, 3, 4 };
    int (& refArr) [ROWS][COLS] = arr;
    
    assert( refArr[1][1] == arr[1][1] );
    assert( sizeof(arr)/sizeof(*arr) == sizeof(refArr)/sizeof(*refArr) );
    assert( sizeof(arr)/sizeof(*arr) == sizeOfGivenArr(arr) );
}


Это сообщение отредактировал(а) Ulysses4j - 11.6.2007, 13:15


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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