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

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

Войти
Регистрация
Восстановить пароль
 
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

Массивы и указатели. - C++

29.12.2011, 15:17. Просмотров 434. Ответов 5
Метки нет (Все метки)

Объясните как работает код, что он будет выводить на экран и почему :

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
#include <stdio.h>
#define PRD(a) printf("%d", (a) ) // Print decimal
#define NL printf("\n"); // Print new line
// Create and initialse array
int a[]={0, 1, 2, 3, 4};
int main()
{
int i;
int* p;
for (i=0; i<=4; i++) PRD(a[i]); // 1
NL;
for (p=&a[0]; p<=&a[4]; p++) PRD(*p); // 2
NL;
NL;
for (p=&a[0], i=0; i<=4; i++) PRD(p[i]); // 3
NL;
for (p=a, i=0; p+i<=a+4; p++, i++) PRD(*(p+i)); // 4
NL;
NL;
for (p=a+4; p>=a; p--) PRD(*p); // 5
NL;
for (p=a+4, i=0; i<=4; i++) PRD(p[-i]); // 6
NL;
for (p=a+4; p>=a; p--) PRD(a[p-a]); // 7
NL;
return 0;
}
С наступающем !
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2011, 15:17     Массивы и указатели.
Посмотрите здесь:

C++ Одномерные массивы и указатели
одномерные массивы и указатели C++
C++ одномерные массивы и указатели
указатели.функции.массивы. C++
C++ C++. Массивы и указатели/ Функции.
Ссылки, указатели и массивы C++
C++ Массивы,указатели,циклы.
C++ Указатели и массивы
C++ Указатели и массивы
Указатели и массивы C++
C++ Указатели и массивы
Массивы и указатели C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 15:34     Массивы и указатели. #2
Цитата Сообщение от Leeto Посмотреть сообщение
for (i=0; i<=4; i++) PRD(a[i]); // 1
NL;
Массив.
Цитата Сообщение от Leeto Посмотреть сообщение
for (p=&a[0]; p<=&a[4]; p++) PRD(*p); // 2
NL;
Снова массив.
Цитата Сообщение от Leeto Посмотреть сообщение
for (p=&a[0], i=0; i<=4; i++) PRD(p[i]); // 3
NL;
И вновь массив
Цитата Сообщение от Leeto Посмотреть сообщение
for (p=a, i=0; p+i<=a+4; p++, i++) PRD(*(p+i)); // 4
NL;
Элементы массива на нечетных позициях.
Цитата Сообщение от Leeto Посмотреть сообщение
for (p=a+4; p>=a; p--) PRD(*p); // 5
NL;
for (p=a+4, i=0; i<=4; i++) PRD(p[-i]); // 6
NL;
for (p=a+4; p>=a; p--) PRD(a[p-a]); // 7
NL;
Массив в обратном поярдке 3 раза.
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
29.12.2011, 17:32  [ТС]     Массивы и указатели. #3
Цитата Сообщение от soon Посмотреть сообщение
Массив.

Снова массив.

И вновь массив

Элементы массива на нечетных позициях.

Массив в обратном поярдке 3 раза.


Спасибо большое! А ты не мог бы еще пояснить, для чего в этой коде вводится указатель и как он здесь работает. Заранее огромное спасибо !
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 17:43     Массивы и указатели. #4
Цитата Сообщение от Leeto Посмотреть сообщение
для чего
Чтобы показать альтернативные способы работы с массивом.
Цитата Сообщение от Leeto Посмотреть сообщение
как он здесь работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (p=&a[0]; p<=&a[4]; p++) PRD(*p); // 2 - изначально указывает на 1 элемент массива, разыменовывется, переходит на следующий элемент
NL;
NL;
for (p=&a[0], i=0; i<=4; i++) PRD(p[i]); // 3 - тоже самое, но разворачивается примерно в следующее *(p + i), что эквивалентно *p из цикла #2 на i-ой итерации цикла
NL;
for (p=a, i=0; p+i<=a+4; p++, i++) PRD(*(p+i)); // 4 - За счет того, что увеличивается p и i будут выводиться элементы массива "через один"
NL;
NL;
for (p=a+4; p>=a; p--) PRD(*p); // 5 - изначально p указывает на последний элемент, разыменовывается, выводится, увеличивается
NL;
for (p=a+4, i=0; i<=4; i++) PRD(p[-i]); // 6 - аналогично #5, развернется в следующее *(p - i)
NL;
for (p=a+4; p>=a; p--) PRD(a[p-a]); // 7 - работа с массивом как обычно, но номер элемента расчитывается путем вычитания из адреса p адресa a
NL;
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
29.12.2011, 17:49  [ТС]     Массивы и указатели. #5
Цитата Сообщение от soon Посмотреть сообщение
Чтобы показать альтернативные способы работы с массивом.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (p=&a[0]; p<=&a[4]; p++) PRD(*p); // 2 - изначально указывает на 1 элемент массива, разыменовывется, переходит на следующий элемент
NL;
NL;
for (p=&a[0], i=0; i<=4; i++) PRD(p[i]); // 3 - тоже самое, но разворачивается примерно в следующее *(p + i), что эквивалентно *p из цикла #2 на i-ой итерации цикла
NL;
for (p=a, i=0; p+i<=a+4; p++, i++) PRD(*(p+i)); // 4 - За счет того, что увеличивается p и i будут выводиться элементы массива "через один"
NL;
NL;
for (p=a+4; p>=a; p--) PRD(*p); // 5 - изначально p указывает на последний элемент, разыменовывается, выводится, увеличивается
NL;
for (p=a+4, i=0; i<=4; i++) PRD(p[-i]); // 6 - аналогично #5, развернется в следующее *(p - i)
NL;
for (p=a+4; p>=a; p--) PRD(a[p-a]); // 7 - работа с массивом как обычно, но номер элемента расчитывается путем вычитания из адреса p адресa a
NL;

Спасибо огромное, soon, разжевал=)

С наступающим тебя !
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 18:15     Массивы и указатели. #6
Цитата Сообщение от soon Посмотреть сообщение
for (p=a+4, i=0; i<=4; i++) PRD(p[-i]); // 6 - аналогично #5, развернется в следующее *(p - i)
NL;
soon, я могу ошибаться, но в 64-битных системах мы можем выйти за пределы массива.

Добавлено через 1 минуту
Хотя нет, не заметил
C++
1
int i;
ошибка будет если unsigned
Yandex
Объявления
29.12.2011, 18:15     Массивы и указатели.
Ответ Создать тему
Опции темы

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