С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
matepuhko
20 / 20 / 6
Регистрация: 05.06.2011
Сообщений: 119
#1

Инкремент ссылки - C++

31.05.2012, 12:49. Просмотров 1254. Ответов 11
Метки нет (Все метки)

C++
1
2
3
4
5
6
int arr[] = {....} ;
while(arr) // arr ссылка на начало массива то есть на 0 элемент ;
{
//тело цикла
++arr ;//инкремент
}
Собственно почему нельзя так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2012, 12:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инкремент ссылки (C++):

Инкремент указателя - C++
#include <iostream> using namespace std; class Student { public: Student(){A=B=C=2;} int getA(){return A;} ...

Инкремент в произведении - C++
Друзья, на ерунде запнулся, допустим: n = 2000; тогда в какой последовательности нужно решать вот это выражение: --n*n*n = ? ...

Инкремент в рекурсии - C++
Ребят, что-то не могу врубиться. Задача: используя рекурсию выводить введенный ранее текст в обратном порядке. Вот рабочая версия: ...

Инкремент переменной - C++
в задании сказано, что пользователь вводит строку и программа выводит ее, но если пользователь вводит еще и цифру, то программа должна...

Инкремент(Декремент) - C++
Есть ли разница,какую употреблять форму:префиксную или постфиксную? Если на экран выводится одно и то же число в префиксной и постфиксной...

Инкремент и преинкремент - C++
Здравствуйте. Я вот решил протестить в чем разница между инкрементом и преинкрементом, и как-то не увидел разницы... В чем же разница? :) ...

11
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
31.05.2012, 12:58 #2
Начнём с того, что имя массива - указатель на первый элемент.

Цитата Сообщение от matepuhko Посмотреть сообщение
C++
1
2
3
4
5
int arr[] = {....} ;
while(arr)
{ 
++arr;
}
Так нельзя, потому что совсем не обязательно, что после выхода за границы массива значение arr обратиться в 0 или NULL. Но с
C++
1
char arr[] = {...}
это будет работать, т.к. там есть завершающий нуль.
0
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
31.05.2012, 13:05 #3
arr это не ссылка, а указатель хранящий в себе адрес ячейки первого элемента, что-то вроде 004AFEF4...если ты добавишь к адресу 1, то у тебя неполучится адреса 2 ячейки)
можно так
C++
1
2
3
4
5
6
7
int arr[] = {....} ;
int i=0;
while(arr[i])
{
//тело цикла
i++;//инкремент
}
Добавлено через 1 минуту
Цитата Сообщение от rakota Посмотреть сообщение
это будет работать, т.к. там есть завершающий нуль.
во всех массивах есть завершающий NULL
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
31.05.2012, 13:10 #4
Цитата Сообщение от matepuhko Посмотреть сообщение
Собственно почему нельзя так?
Потому что с именем массива нельзя так делать.
Цитата Сообщение от matepuhko Посмотреть сообщение
// arr ссылка на начало массива
Не ссылка, а указатель

Цитата Сообщение от rakota Посмотреть сообщение
это будет работать,
Не будет.
Цитата Сообщение от NeonLost Посмотреть сообщение
во всех массивах есть завершающий NULL
Только в строках.

Если вас это утешит, то можно создать указатель и делать с ним, что захочется.
C++
1
2
3
4
5
6
int *p = arr;
    while(p) // пока в памяти не встретиться 0, т.е., возможно, очень нескоро.
    {
        //тело цикла
        ++p ;//инкремент
    }
0
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
31.05.2012, 13:11 #5
Цитата Сообщение от NeonLost Посмотреть сообщение
во всех массивах есть завершающий NULL
Нет, только в строках.
0
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
31.05.2012, 13:20 #6
Цитата Сообщение от rakota Посмотреть сообщение
Нет, только в строках.
#include<iostream>
int main()
{
int mass[6]={1,2,3,4,5};
int i=0;
while(mass[i])
{
std::cout<<mass[i]; i++;
}
}

почему это работает тогда?..
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
31.05.2012, 13:24 #7
Цитата Сообщение от NeonLost Посмотреть сообщение
почему это работает тогда?..
От компилятора зависит. gcc, к примеру, зачем-то ставит 0 после массивов. Но это нестандартное поведение, на другом компиляторе, либо другой версии вашего компилятора такой код может уже сломаться.
0
matepuhko
20 / 20 / 6
Регистрация: 05.06.2011
Сообщений: 119
31.05.2012, 13:25  [ТС] #8
Со строками всё ясно.
Но тогда вопрос,как оформить массив имея только указатель,например на int'овой массив.Точнея каке будет условие выхода
0
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
31.05.2012, 13:28 #9
Цитата Сообщение от NeonLost Посмотреть сообщение
почему это работает тогда?.
Это зависит от компилятора - в стандарте не написано, что такое 100% должно работать.
Мой компилятор (да и ваш тоже, как я погляжу) неинициализированные элементы массива заполняет нулями.
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
31.05.2012, 13:28 #10
Цитата Сообщение от matepuhko Посмотреть сообщение
Но тогда вопрос,как оформить массив имея только указатель,например на int'овой массив.Точнея каке будет условие выхода
Никак. Нужно обязательно знать размер. В случае со статическим массивом( int arr[] ) размер узнать легко, а вот с указателем (int *arr) - никак.
0
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
31.05.2012, 13:33 #11
Цитата Сообщение от rakota Посмотреть сообщение
Это зависит от компилятора - в стандарте не написано, что такое 100% должно работать.
Мой компилятор (да и ваш тоже, как я погляжу) неинициализированные элементы массива заполняет нулями.
ну понятно, работает только с компиляторами , которые нулями заполняют неинициализированные элементы)
0
alkagolik
Заблокирован
31.05.2012, 13:33 #12
Цитата Сообщение от matepuhko Посмотреть сообщение
Собственно почему нельзя так?
Цитата Сообщение от NeonLost Посмотреть сообщение
arr это не ссылка, а указатель хранящий в себе адрес ячейки первого элемента, что-то вроде 004AFEF4...если ты добавишь к адресу 1, то у тебя неполучится адреса 2 ячейки)
это и не указатель, т.к. с указателями можно выполнять арифметические операции в т.ч. инкремент\декремент, что невозможно в данном случае
C
1
int a[] = { 1, 2 , 3 };
это обычный статический массив, размер которого вычисляется при компиляции.
Цитата Сообщение от NeonLost Посмотреть сообщение
почему это работает тогда?..
всего лишь частный случай. Стандартом не предусмотрено кастование выделенной памяти нулями. Возьми к примеру компилятор более ранних версий и убедишься.
0
31.05.2012, 13:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2012, 13:33
Привет! Вот еще темы с ответами:

постфиксный инкремент - C++
class Inkrement { Inkrement(){}; Inkrement &amp;operator++(int) { Inkrement temp = *this; ++*this; return temp; ...

Не работает инкремент - C++
repeat: if(e&lt;=mode){ cout &lt;&lt; &quot;\nИгрок №&quot; &lt;&lt; e &lt;&lt; a &lt;&lt; endl; cin &gt;&gt; sim &gt;&gt; b;//записываем в строку для...

Инкремент указателя на указатель - C++
Добрый день!!! Ребят, подскажите пожалуста, как выполнить инкремент указателя на указатель. Программа аварийно завершается. Я так понимаю,...

Инкремент билда в VS 2008 C++ - C++
Подскажите хоть какое нибудь работающее решение для инкремента билда в VS 2008 для С++


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.