Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для gore-lykovoe
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414

Поясните код 0[&x]

10.09.2013, 18:39. Показов 3569. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
int x = 5;  
0[&x] = x + x;
std::cout<<x;
Выводится 10. Чтобы мы собственно делаем во второй строчке?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.09.2013, 18:39
Ответы с готовыми решениями:

Поясните синтаксис - ( std::string& x: bar )
Наткнулся здесь на использование двоеточия для какого-то рода инициализации ссылки, но не понимаю ни синтаксиса, ни механизма работы: ...

Поясните код
Скачал исходник змейки, сейчас пытаюсь разобраться в коде Вот сам код : #include &lt;iostream&gt; //стандартная библиотека ...

поясните код
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;stack&gt; using namespace std; int main() { string s; getline(cin,...

24
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
10.09.2013, 18:44
0[&x] = &x[0] что значит взяли адрес переменной, представили его как массив из элементов типа переменной x и в нулевой элемент этого массива присвоили значение x+x, хотя вся эта белиберда заменяется оператором x*=2; что расшифровываться как "взять значение переменной x, умножить его на 2 и записать результат обратно в переменную x"
1
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
10.09.2013, 19:16
0[&x] = x + x;
Мне это напоминает вот такое обращение к элементам массива

Обычное обращение к элементу:
int a[10];

a[0] = 1; // адрес[номер_элемента]

Т.е. в нормальном виде сначала пишем имя массива (как известно имя массива - это адрес его первого элемента) и в квадратных скобках номер элемента.

// -------------------------------------------------------------

Так же доступ к любому элементу можно получить в другом (необычном) виде:

0[a] = 1; // номер_элемента[адрес]

Тут все наоборот. Сначала указывается номер элемента а в скобках имя массива

0[&x] = x + x;

0 - это номер_элемента в "массиве"
&x - это собственно адрес "массива"

Конечно, переменная x это не массив

Добавлено через 4 минуты
... но ее можно рассматривать как массив
0
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
10.09.2013, 19:17
gore-lykovoe, по сути оператор [] это синтаксический сахар, который интерпретируется как
C++
1
2
int a[4];
a[1] еквивалентно *( a + 1 )
а как известно от перестановки результат не меняется.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.09.2013, 21:49
Цитата Сообщение от coloc Посмотреть сообщение
a[1] еквивалентно *( a + 1 )
что на самом деле превращается в *(а + 1 * sizeof(*a)), поэтому в данном случае
Цитата Сообщение от coloc Посмотреть сообщение
от перестановки результат не меняется.
меняется.
1
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
10.09.2013, 21:58
Kastaneda, обьясните тогда пожалуйста почему a[1] и 1[a] дают одинаковый результат?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.09.2013, 09:52
Цитата Сообщение от Kastaneda Посмотреть сообщение
что на самом деле превращается в *(а + 1 * sizeof(*a)), поэтому в данном случае

меняется.
Нет. Адресная арифметика в C (и в С++) устроена так, что a[1] == *(a + 1).
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
11.09.2013, 09:57
Цитата Сообщение от CheshireCat Посмотреть сообщение
Нет. Адресная арифметика в C (и в С++) устроена так, что a[1] == *(a + 1).
Да неужели? И что означает единица справа?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.09.2013, 10:03
Ага, вот сюрприз! Открой учебник по Си(++).
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
11.09.2013, 10:12

Не по теме:

Цитата Сообщение от CheshireCat Посмотреть сообщение
Си(+_+)


___
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
11.09.2013, 10:29
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ага, вот сюрприз! Открой учебник по Си(++).
Сам открой и увидишь, что если "a" массив целых по 4 байта и &a[0]=1000, то &a[1] будет не 1001, а 1004
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2013, 10:31
zer0mail, эм, ( a + 1 ) тоже будет 1004, про это и шла речь...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.09.2013, 10:46
Практика - лучший критерий любой теории, не так ли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    int a[100] = {0, 1, 2};
    cout << "a[1]=" << a[1] << "\t\t *(a+1)=" << *(a+1) << endl;
    cout << "a=" << a << "\t a+1=" << a+1 << endl;
    cout << "1[a]=" << 1[a] << "\t\t *(1+a)=" << *(1+a) << endl;
    cout << "&1[a]=" << &1[a] << "\t 1+a=" << 1+a << endl;
 
    return 0;
}
a[1]=1 *(a+1)=1
a=0x22fd40 a+1=0x22fd44
1[a]=1 *(1+a)=1
&1[a]=0x22fd44 1+a=0x22fd44
GCC 4.7.1
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.09.2013, 11:09
CheshireCat, ну так о чем и речь
Цитата Сообщение от CheshireCat Посмотреть сообщение
a=0x22fd40 a+1=0x22fd44
указатель увеличился на 4, а не на 1.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2013, 11:11
Наверно имелось ввиду, что в Вашем случае он уже увеличится на 16:
Цитата Сообщение от Kastaneda Посмотреть сообщение
*(а + 1 * sizeof(*a))
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.09.2013, 11:12
Цитата Сообщение от coloc Посмотреть сообщение
Kastaneda, обьясните тогда пожалуйста почему a[1] и 1[a] дают одинаковый результат?
Ответ прост - язык С позволяет писать и так и так. При этом транслятор понимает где указатель, а где индекс и генерирует правильный код для обоих случаев.

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
Наверно имелось ввиду, что в Вашем случае он уже увеличится на 16:
не понял, откуда 16?
Если a это указатель на int (размер которого пусть будет 4 байта), то *(а + 1 * sizeof(*a)) развернется в
*(а + 1 * 4)
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2013, 11:14
Kastaneda, a == 1000 -> a + 1 == 1004 -> a + 1 * 4 == 1016
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.09.2013, 11:18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Kastaneda, a == 1000 -> a + 1 == 1004 -> a + 1 * 4 == 1016
все равно не понял. Я могу тупить, давай так - если a = 1000 и указывает на массив int'ов, то следующий элемент в массиве будет иметь адрес 1004. Так? Отсюда a + 1 = 1004 => a + 1*4 = 1004. Непонимаю откуда 16.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2013, 11:20
Хорошо. Будем по частям
a == 1000
a + 1 == 1004
sizeof( int ) == 4
a + 1 * 4 == a + 4 == 1016, так как 1 * 4 == 4
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.09.2013, 11:22
Адресная арифметика так устроена.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int a[100] = {0, 1, 2};
 
    // a[1] еквивалентно *( a + 1 )
    // что на самом деле превращается в *(а + 1 * sizeof(*a))
 
    // Дискуссия об адресной арифметике началась с этого утверждения.
    // Проверим его истинность:
 
    cout << "*(a+1)=" << *(a+1) << "   a+1=" << a+1 << endl;
    cout << "*(а+1*sizeof(*a))=" << *(a+1*sizeof(*a)) << "   a+1*sizeof(*a)=" << a+1*sizeof(*a) << endl;
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2013, 11:22
Помогаю со студенческими работами здесь

Поясните код
// ourfunc.cpp — определение собственной функции #include &lt;iostream&gt; void simon(int); // прототип функции simon() int main() { ...

Поясните код
double **a = new double *;

Поясните мне код
На одном из форумов нашел код. Отмечен как прикол. #include &lt;stdio.h&gt; int main() { int a = 1500080243; int b =...

поясните пожалуйста код
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;iomanip.h&gt; ...

Поясните код генератор слов из телефонного кода
Взял решение задачи Дейтела с форума Напишите программу на С++, которая для данного семизначного числа записывает в файл все...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru