Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

Почему передача по ссылке не работает, только по указателю?

05.08.2015, 21:16. Показов 6414. Ответов 102
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include<windows.h>
#include<ctime>
using namespace std;
void input(int*,int);
int main()
{
srand(time(0));
const int n=10;
int arr[n];
input(arr,n);
return 0;
}
void input(int arr[],int k){
    for(int i=0;i<k;i++){
    arr[i]=rand()%2;
    cout<<" "<<arr[i];
}
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2015, 21:16
Ответы с готовыми решениями:

Передача по указателю и по ссылке
Всем привет! Есть функция, в которую передается ссылка: void Compare(int &amp;p) { int * str = p;// здесь ошибка нельзя...

Передача по ссылке или указателю?
В каких случаях лучше передавать в функцию ссылки, а в каких указатели?

Передача по ссылке или по указателю
Класс А здесь минимальный в реальности у него много переменных. Как лучше поступить в таком случае? Удобнее выпольнить передачу по ссылке,...

102
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 22:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
господь бог я не хочу продолжать дальше.
Дык по этой же ссылке про это написано:
Строго говоря вышеописанная реализация массива не является динамической, так как нет изменения размера массива во время работы
Поэтому в С++ нет динамических массивов, зато есть массивы с динамическим размещением. Просто в книгах обычно не делают разницы, т.к. это тонкость терминологии, а не какая-то существенная деталь.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 23:09
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот это настоящий двумерный массив, выделенный в динамической памяти. И память его непрерывна.
это - не настоящий массив языка с++.
потому что "настоящий массив" - это тип данных.

в записи вида:
C++
1
    int (*arr)[8] = new int[5][8];
действительно выделяется память под массив.

однако, сам массив, как тип данных языка с++,
описанный в разделе 8.3.4 Arrays не фигурирует.


даже несмотря на то,
что синтаксис new-expression позволяет использовать типы:

C++
1
2
typedef int ar [8][8];
int (*arr)[8] = new ar;
тем не менее, new-expression выступает лишь в качестве описателя
сколько нужно выделить, и как заполнить.

так же дозволяется использовать динамические значения:
C++
1
2
    size_t n = 8;
    int (*arr)[8] = new int[n][8];
а этот фактор нарушает пункт 8.3.4 стандарта,
согласно которому размерности массива
должны быть заданны константами времени компиляции.

из чего следует, что в new-expression на самом деле используется синтаксический сахар,
внешне очень похожий на массив, но массивом не являющийся.

Добавлено через 2 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
разве std::vector нельзя назвать динамическим массивом ?
назвать можно что угодно, и как угодно.

но официально это - один из стандартных контейнеров.
0
Заблокирован
06.08.2015, 23:19
Цитата Сообщение от DrOffset Посмотреть сообщение
Строго говоря вышеописанная реализация массива не является динамической, так как нет изменения размера массива во время работы
- т.е если я в массиве указателей удалю какой-то страйп и аллокну новый это всё равно будет не динамический массив?Честно для меня звучит как глупость.

Добавлено через 1 минуту
hoggy, у контейнера есть аллокатор, как раз вектор и реализует динамический массив
Загляни сюда, на предмет что есть вектор http://www.cplusplus.com/reference/vector/vector/
template < class T, class Alloc = allocator<T> > class vector; // generic template
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 23:27
hoggy, я там выше уже приводил цитату. New создает объект указанного типа, точка. Если тип - это массив, то будет создан массив.
Для ситуации, когда у нас размерность не константа времени компиляции там заведен специальный вариант - new-type-id (в противовес type-id, посмотри грамматику). Так что это не нарушение пункта 8.3.4, а специально расширенный вариант для new. Иначе смысла в этом new было бы ноль, т.к. все равно пришлось бы все размерности держать в compile-time.

Добавлено через 3 минуты
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
- т.е если я в массиве указателей удалю какой-то страйп и аллокну новый это всё равно будет не динамический массив?
Это будет реализация динамического массива на языке С++. Пример - std::vector. Тут говорится, о том, что язык из коробки таких массивов не дает, а не что их сделать на нем нельзя
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 23:27
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
т.е если я по массиву указателей удалю какой то страйп и аллокну новый это всё равно будет не динамический массив?Честно для меня звучит как глупость.
я попробую вам это объяснить:

C++
1
2
3
4
5
6
7
8
9
10
11
struct some{};
 
int main()
{
    some* arr[3] = { new some, new some,new some,};
    
    delete arr[0];
    
    arr[0] = nullptr;  //<--- в самом массиве элементов не прибавилось и не убавилось
      // их как было 3 штуки, так и осталось
}
так что ваш тезис немножко глуповат.
0
Заблокирован
06.08.2015, 23:27
DrOffset, поясните ваше выссказывание
Цитата Сообщение от DrOffset Посмотреть сообщение
Дык по этой же ссылке про это написано:
Строго говоря вышеописанная реализация массива не является динамической, так как нет изменения размера массива во время работы
Ну вот к примеру я первыделил память (мог сделать это и в другом месте), почему arr не динамический массив?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iomanip>
#include <iostream>
using namespace std;
 
int main(){
    int ** arr = new int*[5];
    for( int i = 0; i < 5; i++ ){
      arr[i] = new int[8];
      delete arr[i];
      arr[i] = new int[10];
      cout<<hex<<arr[i]<<endl;
    }
    for( int i = 0; i < 5; i++ )
        delete arr[i];
    delete arr;
    
    return 0;
}
http://codepad.org/Fb4xgW4V
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 23:28
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
у контейнера есть аллокатор, как раз вектор и реализует динамический массив
ну и?
0
Заблокирован
06.08.2015, 23:30
Цитата Сообщение от hoggy Посмотреть сообщение
some* arr[3] = { new some, new some,new some,};
delete arr[0];
- причём здесь статический массив, ты сам arr грохни и сам всё увидишь
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 23:31
Цитата Сообщение от DrOffset Посмотреть сообщение
Так что это не нарушение пункта 8.3.4, а специально расширенный вариант для new. Иначе смысла в этом new было бы ноль, т.к. все равно пришлось бы все размерности держать в compile-time.
это все понятно.

не понятно, почему вы думаете,
что "расширенный вариант для new" не нарушает 8.3.4

Добавлено через 53 секунды
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
причём здесь статический массив, ты arr грохни и сам всё увидишь
это - не статический массив.
это - локальный массив.
он расположен на стеке.
0
Заблокирован
06.08.2015, 23:32
Цитата Сообщение от hoggy Посмотреть сообщение
ну и?
- ну и то что там массив перудаляется каждый раз на ресайзе и пушбеке, зайди в vector и посмотри сам. И в том что ты гупость сказал на счёт динамики.

Добавлено через 42 секунды
Цитата Сообщение от hoggy Посмотреть сообщение
это - не статический массив.
это - локальный массив.
он расположен на стеке.
- это статический массив, его нельзя расширить
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 23:33
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
поясните ваше выссказывание
Во-первых это не мое высказывание, это написано по ссылке на вики, которую вы же сюда и запостили.
Во-вторых это динамический массив, который вы сами написали. А цитата говорит о том, что в сам язык такие массивы не поддерживает.
Ближайший аналогичный пример - это строки. Всем известно, что строки в С\С++ - это на самом деле массивы символов. Если мы не поставим в конце ноль, то данный массив символов перестанет считаться "строкой". Однако, например, в паскале есть тип string, который является настоящей строкой. Его "строковость" поддерживается самим языком и не зависит от того решил программист поставить ноль или не решил. Понимаете?
0
Заблокирован
06.08.2015, 23:37
Цитата Сообщение от DrOffset Посмотреть сообщение
А цитата говорит о том, что в сам язык такие массивы не поддерживает.
- ну так та цитата вообще голое утверждение без пруфов.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 23:38
Цитата Сообщение от hoggy Посмотреть сообщение
не понятно, почему вы думаете,
что "расширенный вариант для new" не нарушает 8.3.4
Потому что ты сам привел пример, когда задавал тип массива через typedef. А в этом случае работает вариант грамматики для type-id, а не для new-type-id. Поэтому, строго говоря, new создает полностью легально массив, с dynamic storage duration. Если допустить, что ты прав с этим нарушением, то у нас половина спецификации языка рассыпается, где-то начиная с момента, где говорится, что любой объект можно разместить в одном из нескольких вариантов памяти (automatic, static, thread local и dynamic storage duration). Получается, что настоящие массивы (сюда даже одномерные попадают) не могут находиться сами по себе в dynamic storage. А это звучит очень странно.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
06.08.2015, 23:40
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
Ну вот к примеру я первыделил память (мог сделать это и в другом месте), почему arr не динамический массив?
Был бы он динамическим, вы бы не удаляли его и не выделяли память обратно.
Точно так же, как вы не можете любой материальный объект взять, и сделать больше. Можно только вместо одного объекта взять другой большего размера. Оба объекта при этом не изменяются. А если не изменяются, значит статичны, правильно?
0
Заблокирован
06.08.2015, 23:42
Цитата Сообщение от DrOffset Посмотреть сообщение
Если мы не поставим в конце ноль, то данный массив символов перестанет считаться "строкой". Однако, например, в паскале есть тип string, который является настоящей строкой. Его "строковость" поддерживается самим языком и не зависит от того решил программист поставить ноль или не решил. Понимаете?
- не стоит расценивать меня как нуба, конечно я знаю что такое строки. Я даже знаю что 0 автоматом присутствует при объявлении строкового литерала, а тут вы мне пишете как школьнику. Вы исходя из всех прочитанных мною источников ошибаетесь называя динамический массив эмуляцией - это единственная цель нашей беседы ради которой я её поддерживаю.

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

Не по теме:

Цитата Сообщение от Eraston Посмотреть сообщение
Был бы он динамическим, вы бы не удаляли его и не выделяли память обратно.
- т.е когда мы записываем new получаем статический объект - NICE:bravo:

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 23:43
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
ну так та цитата вообще голое утверждение без пруфов.
А пруф простой, в спецификации языка понятие dynamic array встречается только применительно к классам стандартной библиотеки.
Я просто хочу сказать, что это вполне понятное и логичное заблуждение. Просто авторы книг или переводчики обычно не делают разницы, ставя знак равенства между динамическим массивом и массив с динамическим размещением. Но формальная разница есть. Я не говорю, что нужно сейчас перестать называть массивы С++ динамическими. Я не выступаю за тотальный формализм, нет. Но можно где-то в подкорке у себя держать флажок об это разнице. И не делать удивленные глаза, когда об этом заходит речь.
0
Заблокирован
06.08.2015, 23:43
DrOffset, конечно же плюсы имеют иной механизм выделения памяти нежели Сишный, но динамический массив от этого динамическим быть не перестаёт, ваши аргументы я услышал, но скажу честно не переубедили(надеюсь ругаться не будете)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 23:46
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
Вы исходя из всех прочитанных мною источников ошибаетесь называя динамический массив эмуляцией - это единственная цель нашей беседы ради которой я её поддерживаю.
Самый главный источник - это стандарт. В стандарте у массивов есть определение, остальное - это уже логика, которую реализует программист. Можно назвать такой рваный массив многомерным, потому что он реализует его логику. Но надо понимать, что это не тоже самое, что array в спецификации языка.
И я не считаю вас за нуба.
Вы отвлеклись на личное, хотя личного в моем посте не было. Прочитайте еще раз к чему было написано про строки, но на этот раз без эмоций.
0
06.08.2015, 23:48

Не по теме:

Цитата Сообщение от ОгУрЕц Посмотреть сообщение
т.е когда мы записываем new получаем статический объект - NICE
Нет, блин, он у нас плавает где хочет. У него есть строго заданный адрес, строго заданный размер, и сам по себе он в памяти своего местоположения не меняет.

0
Заблокирован
06.08.2015, 23:50
Цитата Сообщение от DrOffset Посмотреть сообщение
И я не считаю вас за нуба.
Вы отвлеклись на личное, хотя личного в моем посте не было. Прочитайте еще раз к чему было написано про строки, но на этот раз без эмоций.
- да нет же я не ругаться хотел, а найти истину, я всего лишь гораздо ранее написал, что считаю верным выделять всё в одном блоке(одномеркой) на заданное число элементов двумерной или n-мерной матрицы и реализовывать многомерную архитектуру за счёт перегрузки индексного оператора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2015, 23:50

Передача аргументов в функцию по ссылке и указателю
Чем отличается передача по ссылке от передачи по указателю аргументов в функцию?

Передача в функцию по ссылке или указателю
Гуру C++, как предпочтительнее делать?:) void f1(int &amp;a) { a = 5; } void f2(int * a) {

Передача std::vector в конструктор[по ссылке\указателю ?]
Доброго времени суток. Есть такой интерфейс класса: class HH_model_class { private: std::vector&lt;double&gt; parameters; ...

Передача параметров в функцию по значению, по ссылке и по указателю
Доброе время суток товарищи программисты. Столкнулся с кучей ошибок в написании простой программы. Задача заключается в том чтобы написать:...

Передача параметров функции по значению, ссылке и указателю
Вычислить F=f(a)-5f^3(sin(b/2))+1/f(1+c^4), де f(x)=3x^2-2x^2+7, при a=5.08, b=-0.65, c=3.87 Добавлено через 45 минут #include...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru