Форум программистов, компьютерный форум CyberForum.ru

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

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

Инкремент(Декремент) C++
C++ Инкремент указателя
C++ Инкремент в рекурсии
Инкремент и преинкремент C++
C++ Инкремент переменной
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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[] = {...}
это будет работать, т.к. там есть завершающий нуль.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 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
diagon
Higher
 Аватар для diagon
1920 / 1186 / 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 ;//инкремент
    }
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
31.05.2012, 13:11     Инкремент ссылки #5
Цитата Сообщение от NeonLost Посмотреть сообщение
во всех массивах есть завершающий NULL
Нет, только в строках.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 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++;
}
}

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

C++ Не работает инкремент
C++ постфиксный инкремент

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
31.05.2012, 13:33     Инкремент ссылки #12
Цитата Сообщение от matepuhko Посмотреть сообщение
Собственно почему нельзя так?
Цитата Сообщение от NeonLost Посмотреть сообщение
arr это не ссылка, а указатель хранящий в себе адрес ячейки первого элемента, что-то вроде 004AFEF4...если ты добавишь к адресу 1, то у тебя неполучится адреса 2 ячейки)
это и не указатель, т.к. с указателями можно выполнять арифметические операции в т.ч. инкремент\декремент, что невозможно в данном случае
C
1
int a[] = { 1, 2 , 3 };
это обычный статический массив, размер которого вычисляется при компиляции.
Цитата Сообщение от NeonLost Посмотреть сообщение
почему это работает тогда?..
всего лишь частный случай. Стандартом не предусмотрено кастование выделенной памяти нулями. Возьми к примеру компилятор более ранних версий и убедишься.
Yandex
Объявления
31.05.2012, 13:33     Инкремент ссылки
Ответ Создать тему
Опции темы

Текущее время: 18:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru