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

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

05.08.2015, 21:16. Показов 6466. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru