Code: int a[] = {5, 4, 9}; for(int *b = a, *c = b + 3; b != c; ++b) cout << *b << endl; ruxeez@ruxeezpc:~$ ./a.out 5 4 9 ruxeez@ruxeezpc:~$ Code: int a[] = {5, 4, 9}; for(int *b = a; b != b + 3; ++b) cout << *b << endl; ruxeez@ruxeezpc:~$ ./a.out ... 1701670766 1919251501 1634625901 1029636204 778121006 7632239 778121006 7632239 0 Ошибка сегментирования ruxeez@ruxeezpc:~$ Почему первый вариант работает правильно, а второй - нет?
Gar|k подсказал: каждый раз идёт сравнивание значения с суммой, в которой "b" так же меняется, т.е. с каждым инкрементом сумма, с которой мы сравниваем, увеличивается. Изменил на: Code: int a[] = {5, 4, 9}; for(int *b = a; b != a + 3; ++b) cout << *b << endl;
Не могу удержаться, такого я давно не видел. XD У вас в условии цикла левый операнд ВСЕГДА больше правого на 3*sizeof(int). Как я догадался? Подскажет КЭП.
wolmer Ещё более жжёт!!! * означает операцию разыменования. Но цикл остановится например в таком случае. {2,3,4,5,3} И доблестно программа выведет 2.
бес шуток прекращайте нести... объявляется указатель b которому присваевается указатель а. равносильно int * b; b=a; а указывает на первый элемент массива a
Ru}{eeZ Попробуй передать в функцию указатель на двухмерный массив и там в функции в цикле его повыводить Так, для практики
Я гребу... Вы берёте адрес указателя. и пытаетесь присвоить указателю. Мы с компилятором сходимся в мнении Error 1 error C2440: 'initializing' : cannot convert from 'int (*)[3]' to 'int *' c:\projects\z24\z24\z24.cpp 13 z24
Можно, если найти или написать соответствующий класс, только это будут не массивы, а разновидность контейнеров. Irdis, ты по-моему перевозбуждён)
в данном случае не адрес указателя а адрес массива (указатель на массив) тоесть указатель на первый элемент не генерируется если "имя массива" является операндом унарного оператора &, или операндом операций ++, --, sizeof, или левым операндом присваивания, или операндом оператора . (точка).
Подскажите ещё с итераторами. Так работает нормально: Code: vector<int> a; a.push_back(4); a.push_back(3); a.push_back(7); a.push_back(446); a.push_back(1); a.push_back(0); int b = 0; for(vector<int>::iterator iter = a.begin(); iter != a.end(); ++iter, ++b) {b % 2 != 0 ? *iter *= 2 : 0; cout << *iter << endl;} А так нет: Code: vector<int> a; a.push_back(4); a.push_back(3); a.push_back(7); a.push_back(446); a.push_back(1); a.push_back(0); int b = 0; for(vector<int>::iterator iter = a.begin(); iter != a.end(); ++iter, ++b) b % 2 != 0 ? cout << *iter *= 2 << endl : 0; ruxeez@ruxeezpc:~$ g++ '/home/whitezoron/Рабочий стол/Proging/Стэнли Липман/x.9.cpp' /home/whitezoron/Рабочий стол/Proging/Стэнли Липман/x.9.cpp: In function ‘int main()’: /home/whitezoron/Рабочий стол/Proging/Стэнли Липман/x.9.cpp:26: error: invalid operands of types ‘int’ and ‘<unresolved overloaded function type>’ to binary ‘operator<<’ ruxeez@ruxeezpc:~$ Как сделать, чтобы второй вариант работал? Расставить приоритеты?
Не только в приоритетах дело. Но и c?a:b; must typeof(a) == typeof(b) далее читирим c помощью типа void*.