Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/75: Рейтинг темы: голосов - 75, средняя оценка - 4.55
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32

Ссылки vs указатели - в чем разница?

21.11.2015, 20:04. Показов 16736. Ответов 150
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Навеяно соседней темой. Не понимаю в чем разница, хотя несколько раз честно пробовал почитать на эту тему, правда без должного внимания и усердия. Зато программировал на ассемблере и чистом С, понимаю абстракцию "адрес ячейки памяти" и "размер типа в байтах", с арифметикой указателей и указателями на указатели сложностей вроде не испытываю Есть переменная, если она не регистровая - то лежит в какой-то ячейке памяти (или нескольких, зависит от разрядности памяти и структуры типа переменной), адрес этой ячейки (ака указатель) я могу запоминать в другую переменную типа указателя, передавать/возвращать ее из функций, инкрементировать/декрементировать для движения по массиву переменных (если я его предварительно нарезал в той области памяти конечно), разыменовывать и получать/изменять значение. Вроде все. При чем тут термин "ссылки"? А еще оказывается бывают смартпоинтеры, умные указатели и прочие страшные слова
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2015, 20:04
Ответы с готовыми решениями:

Указатели и ссылки: в чем разница
Здравствуйте, объясните, пожалуйста, в чем разница между "ссылается" и "указывает"?

Указатели и ссылки: в чём их разница и сходство?
Я начал учить с++ и не могу кое в чём разобраться. Кто знает ответы на эти вопросы может ответить или скинуть какую нибудь ссылку где это...

в чем разница? массивы и указатели строк
В примере Дейтла ( в документе ) массивы строк инициализируются через указатели, при этом компилятор выдает ошибки. Я же инициализоравал...

150
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.11.2015, 15:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
мало того, что ничего не доказывает
Ой ли? Разве вывод сигнатуры сгенерированной компилятором функции не подходит под доказательство?
А доказательством является вывод пар строк reference || other?

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

Цитата Сообщение от hoggy Посмотреть сообщение
особое внимание: код должен без вопросов компилироваться.
Каюсь, я не дописал #include <iostream>, вариться мне в котле за это века вечные
А также надеялся что __FUNCSIG__ определён в vc, но этого не знал, сорри.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.11.2015, 15:31
Цитата Сообщение от Nosey Посмотреть сообщение
Ой ли? Разве вывод сигнатуры сгенерированной компилятором функции не подходит под доказательство?
ваш код даже не компилируется.
0
22.11.2015, 15:39

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
ваш код даже не компилируется.
http://rextester.com/QDHVE48247

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.11.2015, 15:42
Цитата Сообщение от Nosey Посмотреть сообщение
http://rextester.com/QDHVE48247
отлично.
завтра регтестер почистится,
и ваша ссылка станет не валидной.
что тогда?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.11.2015, 16:06

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
Цитата Сообщение от Nosey Посмотреть сообщение
http://rextester.com/QDHVE48247
отлично.
завтра регтестер почистится,
и ваша ссылка станет не валидной.
что тогда?
Получается что завтра вам придётся снова меня попросить добавить iostream.
П.с. можно в личку.


Так что насчёт decltype, он работает лучше в данном контексте?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.11.2015, 16:33
Цитата Сообщение от Nosey Посмотреть сообщение
Так что насчёт decltype, он работает лучше в данном контексте?
дело даже не в нем.

представьте себе, что вам задали вопрос:
какой тип данных является ссылочным?

вы можете по разному ответить на этот вопрос.
а можете сделать отсылку к первоисточнику:

C++
1
std::is_reference<type>::value
это - стандартная мета-функция, которая возвращает true для любых type,
которые являются ссылочными типами.


можно смело утверждать, что раз std::is_reference
вернула true, значит тип данных действительно является ссылочным.

результатом
decltype( имя-переменной )

является тип переменной указанной в скобочках.

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

таким образом в коде:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template<class T>
bool isReference(T&& obj)
{
    // вместо decltype(obj)
    // будет подставлен тип данных obj
 
   // и соотвественно,
   // std::is_reference<тип>::value
   // вернет 1, если тип - ссылочный
   //и соотвественно, все условие станет истинным 
 
   //но самое главное - это не зависит ни от вашего мнения
   //ни от моего мнения.
   //ведь мы - люди, и можем ошибаться
 
  
   //это говорит нам сама стандартная библиотека
 
   //поэтому, этой информации мы можем верить
   //а значит использование std::is_reference
   //является доказательством.
 
    if( std::is_reference< decltype(obj) > :: value)
        return std::cout << "reference\n", true;
    
    return std::cout << "other\n", false;
}
Добавлено через 4 минуты
Цитата Сообщение от Nosey Посмотреть сообщение
Получается что завтра вам придётся снова меня попросить добавить iostream.
а если бы уехали куда нибудь?
вне зоны действия сети?

получается, что вы - бесполезный источник информации.

а вот если бы вы не только ссылку на онлайн компилятор положили,
но и сам исходный код тоже выложили - проблем бы не было.

любой желающий всегда сможет получить работоспособную пример-иллюстрацию.
0
83 / 10 / 8
Регистрация: 17.11.2015
Сообщений: 39
22.11.2015, 16:55
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cassert>
 
template<class T>
bool isReference(T&& obj)
{
    if( std::is_reference< decltype(obj) > :: value)
        return std::cout << "reference\n", true;
    
    return std::cout << "other\n", false;
}
 
 
int main()
{
    int v = 10;
    
    
    int* p = &v;
    const auto success = isReference(*p);
    
    assert(success  && "ERROR: expected reference" );
    
}
Весьма странный код, он всегда будет печатать "reference", если я не ошибаюсь. Разница будет лишь в том, lvalue или rvalue ссылка.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.11.2015, 18:03
Цитата Сообщение от hoggy Посмотреть сообщение
обычно константными ссылками называют ссылки,
Ну, это древняя традиция в расчёте на понимание контекста, потому что и константный указатель это чаще всего на самом деле "указатель на константу", хотя правильнее же так и сказать, но говорят наоборот. И тут у проггеров С++ есть шара которой нет ни у кого. Пока хочешь понимать перекодируешь (если надо) "константный указатель" -> "указатель на константу", а если не хочешь, - есть повод возмутиться и сказать: "это Вы
const T*
путаете с
T* const "
?!
Ссылку на константу тоже часто называют "константной ссылкой". Легче произносить потому что.
Но ссылка константна по природе и не нужно её объявлять таковой. Это потому что невозможно присвоить одну ссылку другой. При попытке всегда происходит присвоение значения. То есть ссылка в принципе неизменяемый объект и объявлять его таковым не имеет смысла. Поэтому присвоение ссылки как и константы любого типа возможна только в момент объявления. То есть требуется явная инициализация. (О том как это в конструкторах делается не нужно иначе всю жизнь будем толочь). А указатель, - сколько угодно можно присваивать. Если он не объявлен константным (не на константу а именно константным).
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.11.2015, 20:02

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
а если бы уехали куда нибудь?
вне зоны действия сети?
получается, что вы - бесполезный источник информации.
а вот если бы вы не только ссылку на онлайн компилятор положили,
но и сам исходный код тоже выложили - проблем бы не было.
любой желающий всегда сможет получить работоспособную пример-иллюстрацию.
Договорились, в следующий раз постараюсь :)



И касательно константных ссылок, я тут поковырялся, скажу честно никогда не сталкивался, да и не использовал в метапрограммирование is_const, полагался на пользователя.
Проверив ваш код, я согласен с утверждением
Цитата Сообщение от hoggy Посмотреть сообщение
который в принципе не обладает квалификатором const.
Но код примера вашего мальца не верный, поскольку const int& r = v; - ссылка на константные данные, а std::is_const - проверяет константность самого типа. т.е. еслиб мы могли написать int& const r = v; то std::is_const отработал. Мы можем проверить непосредственно константность данных предварительно убрав ссылку через std::remove_reference
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.11.2015, 21:15
Цитата Сообщение от IronPhoenix Посмотреть сообщение
Весьма странный код, он всегда будет печатать "reference", если я не ошибаюсь. Разница будет лишь в том, lvalue или rvalue ссылка.
Имя переменной это в некотором смысле ссылка. На самоё себя.
Вообще, новичку тут тяжко что-то вычитать. Но кому было легко?
Хочу простую вещь вспомнить. Никто не вспоминает потому, что она давно уже кажется естественной как воздух. Хотя каждый когда видел впервые наверное балдел.
Есть языки в которых вызов по ссылке пишется специальным образом. В C# для этого служит ключевое слово ref. Оно пишется перед каждым аргументам в месте вызова. Иначе не скомпилируется. Это не спроста. Это потому, что иначе в месте вызова не видно по ссылке или по значению передан аргумент. Ещё хуже то, что компилятор не имеет возможности понять какая перегрузка должна быть вызвана если присутствуют оба варианта: и по ссылке и по значению. То есть код с такой перегрузкой просто не компилируется. В C++ не скомпилируется.
Не удивительно, что мозг новичка не компилирует такой синтаксический подход тоже.
Ну то есть простой пример из давно забытого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
 
void Changer(int &toChange){
toChange+=1;
}
 
void Changer(int *toChange){
*toChange+=1;
}
/*
//нельзя иметь перегрузки по ссылке и по значению одновременно
//оно и понятно
//иногда помогает модификатор const))
void Changer(int toChange){
toChange+=1;
}
*/
int  main(void)
{
int a=0;
Changer(&a);//тут операция взятия адреса подсказывает что в функцию отдаётся указатель.
cout<<a<<endl;
//вообще любые типы аргументов в месте вызова нормально видны. Кроме ссылок:
Changer(a);//если бы не intellisense то не глядя вобъявление в месте вызова не понять вызов по ссыдке или по значению 
cout<<a<<endl;
    cout << endl;
    system("pause");
    return 0;
}
0
83 / 10 / 8
Регистрация: 17.11.2015
Сообщений: 39
23.11.2015, 01:12
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть код с такой перегрузкой просто не компилируется. В C++ не скомпилируется.
Скомпилируется. Если Вы будете его вызывать, передавая туда lvalue, то компилятор выдаст ошибку, потому что действительно непонятно, какую функцию вызывать. Однако, если вызова не будет вообще, или вы передадите в функцию rvalue, или вы передадите std::cref() от вашего объекта, или просто скастуете объект к const &, то всё скомпилируется и будет вызываться функция, принимающая параметр по значению. Любопытно, что функцию, принимающую ссылку, тоже можно вызвать. Например, вот таким способом:

C++
1
std::bind<void(int&)>(Changer, std::placeholders::_1)(a);
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.11.2015, 11:29
Цитата Сообщение от IronPhoenix Посмотреть сообщение
Скомпилируется.
В математике нельзя ставить точку если есть "если". Потому что, если есть "если" то это значит "Вообще говоря, не скомпилируется", но "при вот таких условиях - скомпилируется". Приятно ли самому работать или передать в библиотеке код с такими вот ограничениями?
Я говорил о передаче lvalue. Это видно из сравнения с C# и из приведенного кода. Хотя любые ограничения обходятся созданием новой переменной. То есть можно говорить до бесконечности.
За приведенные примеры спасибо про rvalue и кастинг знал, остальное - интересно.
Плюсы вообще интересны тем, что пока не вызовешь, код как Домоклов меч, - не проверяется.
1
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
25.11.2015, 09:21
Интересно, что результат будет разный, хотя сам вызов одинаковый.
Вроде и там и там компилятору говорят "передается массив из 2 элементов", однако ж...
C++
1
2
3
4
5
6
7
8
9
10
void fa(int a[2])          {    cout<<sizeof(a);    }
void fr(int (&a)[2])       {    cout<<sizeof(a);    }
int main()
{
    int A[2];
    cout<<sizeof(A);
    fa(A); // выведет 4
    fr(A);  // выведет 8
    return 0;
}
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
25.11.2015, 10:16
Цитата Сообщение от zer0mail Посмотреть сообщение
Интересно, что результат будет разный, хотя сам вызов одинаковый.
Вроде и там и там компилятору говорят "передается массив из 2 элементов", однако ж...
1) Ничего интересного, потому что в первом случае передается не массив. Это ж азы вообще, как так?
2) Надо читать предупреждения компилятора, они для кого?
3) Просто везение для zer0mail, что результаты разные. Так уж сложилось, что зачем-то собирается 32-битная версия Собиралась бы 64-битная, тогда с большой вероятностью везде выдало 8. Так бы и думал, что разницы никакой.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
25.11.2015, 10:45
Лаконичнее всего на тему ссылок, по моему, Охотник высказался:
Цитата Сообщение от oxotnik Посмотреть сообщение
Ссылка не есть копия объекта, это есть тот же самый объект.
Т.е. к примеру у человека есть имя Иван и есть его кличка Лысый, оба эти имени указывают на одного и того же человека. "Лысый" его альтернативное имя.
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.11.2015, 11:09
Цитата Сообщение от zer0mail Посмотреть сообщение
Интересно, что результат будет разный, хотя сам вызов одинаковый.
Вроде и там и там компилятору говорят "передается массив из 2 элементов", однако ж...
Цитата Сообщение от ct0r Посмотреть сообщение
1) Ничего интересного, потому что в первом случае передается не массив. Это ж азы вообще, как так?
Когда проводишь эксперименты, то одна из стандартных ошибок - использовать в экспериментах тривиальные значения типа 0, 1, 2. Иногда со значениями типа 4 можно сделать неправильный вывод (т.е. признать, что 4 это 2+2, а не 2*2 или 2^2). Поэтому для быстрых экспериментов по возможности надо использовать кривые значения. Если бы в примере для размера массива вместо числа 2 было бы использовано число 111, то уже по одному результату эксперимента (числа 444 и 4) можно было бы догадаться о многом

Добавлено через 1 минуту
И ещё если бы тип был не int, а char, то было бы ещё проще
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2015, 11:59
Цитата Сообщение от ct0r Посмотреть сообщение
как так?
Так классный же вопрос!
Куче народу может быть интересно. Вот я не уверен но мог бы сказать следующее:
Ссылка как сущность в области и как механизм передачи в функцию это не одно и то же, хотя обозначаются похоже. На эту тему ошибаются все. Тут даже не в опыте дело. У меня, например, - если давно рыбы не ел + пасмурно, ещё и не такое может получиться.
zer0mail, смотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
 
template<class T>
int sizeOfType(T var)
{
return sizeof(var);
}
 
template<class T, const int N >
int sizeOfArrType(T (&var)[N])
{
return sizeof(var);
}
 
int  main(void)
{
 
    int A[2];
cout<<sizeof(A) << endl; //8   
cout<<sizeOfType(A)<<endl;//4 тут указатель принялся
cout<<sizeOfArrType(A)<<endl;//8 тут передача по ссылке ПЕРЕМЕННОЙ (не ссылки)
int (&B)[2]=A;//кто скажет что это трудный синтаксис? o_O
cout<<sizeof(B)<<endl;//8 вот это размер по ссылке в чистом виде)
 
cout << endl;
    system("pause");
    return 0;
}
ну то есть знак & после типа в объявлении параметра это соглашение о передаче "по ссылке". Но это не передача ссылки.
ps про поводу того что имена это ссылки не нужно иначе запутаем всё опять. Важно что когда это специально не оговорено то можно сказать "переменная"
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.11.2015, 13:12
Вообще изначально вопрос был задан в виде "в чём разница между указателями и ссылками". Таких тем на форуме море и в основном они стандартно перетекают в обсуждение "что такое ссылка" и споры на тему "ссылка это синоним объекта" vs "ссылка это константный указатель"

На тему последнего мне давно хотелось высказаться, но вот только сейчас пришло понимание, как это сделать более понятно. Оба определения (про синоним и про константный указатель) по своему смыслу являются правильными. Различие между этими определениями в том, что объяснение про синоним - математическое (абстракция), а объяснение про указатель - программерское (реализация абстракции)

Рассмотрим следующий пример. В нём две связки функций: aaaaa-bbbbb и ccccc-ddddd. По смыслу они делают одно и то же, просто в первом случае параметр функции передаём по значению, а во втором - через ссылку. Если рассуждать математически, то в первом случае при передаче параметров создаётся копия переменной, а во втором - вместо копии создаётся синоним переменной. И опять-таки если рассуждать математически, то второй вариант (с ссылкой) кажется более быстрым, т.к. в нём НЕ создаётся копии, а создаётся лишь синоним, который интуитивно кажется конструкцией, ничего лишнего не создающей

C++
int aaaaa (int p)
{
  return p + 1;
}
 
int bbbbb (void)
{
  int x;
  x = 10;
  return aaaaa (x);
}
 
int ccccc (const int &p)
{
  return p + 1;
}
 
int ddddd (void)
{
  int x;
  x = 10;
  return ccccc (x);
}
Но теперь посмотрим на реализацию. В примере я использовал низкий уровень оптимизации (-O1) и выключенный инлайнинг (опция -fno-inline) только с одной целью - оставить тестовый пример маленьким и понятным. Можно сразу же подать агрессивные оптимизации (-O3 -finline), но тогда пример пришлось бы делать менее синтетическим и более реальным (размазать исходник по нескольким функциям). В ассемблерной выдаче я отфильтровал ненужные псевдооперации ассемблера, которые не являются реальным кодом (чтобы мусора перед глазами не было)

Code
$ g++ -O1 -fno-inline t.cc -S
$ cat t.s
 
_Z5aaaaai:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    incl    %eax
    popl    %ebp
    ret
 
_Z5bbbbbv:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    $10, (%esp)
    call    _Z5aaaaai
    leave
    ret
 
_Z5cccccRKi:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    incl    %eax
    popl    %ebp
    ret
 
_Z5dddddv:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $20, %esp
    movl    $10, -4(%ebp)
    leal    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    _Z5cccccRKi
    leave
    ret
Если мы поглядим на код, то увидим, что первый вариант (с копированием значения) на самом деле является более быстрым. При этом если опираться на математическое описание ссылки в виде абстрактного синонима, то сей эффект объяснить будет сложно. Но как только мы переключимся на программерское объяснение через указатели, то сразу всё встанет на свои места. Напишу для наглядности эквивалентный пример на Си через указатели:

C
int aaaaa (int p)
{
  return p + 1;
}
 
int bbbbb (void)
{
  int x;
  x = 10;
  return aaaaa (x);
}
 
int ccccc (int* const p)
{
  return *p + 1;
}
 
int ddddd (void)
{
  int x;
  x = 10;
  return ccccc (&x);
}
Пока в компьютерах присутствуют понятия "память" и "регистр", ссылка будет реализована через указатели. В том месте, где мы создаём синоним, на самом деле мы берём указатель на переменную. Следовательно, эта переменная не может лежать на регистре, а гарантированно попадёт в стек (т.е. работа пойдёт через медленную память, а не через быстрые регистры). И в коде мы это хорошо видим. В связке функций aaaaa-bbbbb работа со стеком появляется только там, где происходит передача параметра (т.к. по программным соглашениям параметр передаётся через стек), а в связке ccccc-ddddd мы видим дополнительные обращения в память для обслуживания работы указателя.

То, что мы тут наблюли, называется Дырявая абстракция. Т.е. пока вы программируете на колхозно-бытовом уровне и у вас стоит задача в виде "запрограммировать действие", вам достаточно жить на абстрактных математических описаниях и не вникать в особенности реализации. Но если вы хотите при всём этом ещё и написать быстро работающую программу, то вам придётся заглядывать вовнутрь абстракции, потому что без реального понимания, как оно всё работает, эффективную программу написать сложно

Если скомпилировать тестовый пример с опцией -O3, то начнёт работать inline и все промежуточные обращения в память при работе с указателям будут соптимизированы и код функций bbbbb получится и ddddd одинаково быстрым. Но для этого нужно компилятору возможность делать inline (т.е. чтобы он видел тело вызываемой функции), а потому нужно ещё и программу писать соответствующим образом. Но здесь мы имеем тот же эффект - нам нужно заглядывать вовнутрь абстракции (т.е. понимать, как оно всё устроено изнутри и как работает компилятор), чтобы построить быстро работающий код
1
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
25.11.2015, 18:27
Цитата Сообщение от ct0r Посмотреть сообщение
1) Ничего интересного, потому что в первом случае передается не массив. Это ж азы вообще, как так?
2) Надо читать предупреждения компилятора, они для кого?
3) Просто везение для zer0mail, что результаты разные. Так уж сложилось, что зачем-то собирается 32-битная версия Собиралась бы 64-битная, тогда с большой вероятностью везде выдало 8. Так бы и думал, что разницы никакой.
1) Что передается в первом случае? Вижу абсолютно одинаковый ассемблерный код. То что передаче массива передается адрес первого элемента я знаю не один десяток лет и нигде не утверждал другое.
2) Никаких предупреждений компилятора я не вижу. Вы о чем, собственно?
3) Не надо априори считать других дурней паровоза. Я знаю размеры типов для своей программы и привел минимальный пример, демонстрирующий различия.

Получается, что от ваших замечаний, господин ct0r, остался один пшик...
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
25.11.2015, 18:47
Цитата Сообщение от zer0mail Посмотреть сообщение
Никаких предупреждений компилятора я не вижу
warning: 'sizeof' on array function parameter 'a' will return size of 'int*' [-Wsizeof-array-argument]
void fa(int a[2]) { cout<<sizeof(a); }
* * * * *
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2015, 18:47
Помогаю со студенческими работами здесь

Ссылки и указатели - в чем преимущество одного над другим
Известно, что главной причиной появления ссылок в С++ было дать более безопасную альтернативу указателям в некоторых ситуациях. Ссылка в...

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

Указатели и ссылки [С++]
Всем привет. я тут программу делаю. Цель: определить,принадлежит ли точка заданному промежутку(а точнее лежит внутри или снаружи фигуры)....

Ссылки и указатели
Вот есть код в котором я проверял как ведут себя указатели : using namespace std; int* first() { int p = 5; cout &lt;&lt;...

Ссылки и указатели
Здравствуйте, может кто объяснить в чем будет отличие при передаче в функцию по **, *, *&amp;, &amp;(**), желательно на примерах простых


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru