Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2018, 14:34   #1
CrazyChicken
 
Регистрация: 28.03.2018
Сообщений: 3
По умолчанию Действия с массивами

Привет! Я новичок на форуме. Вот пытаюсь разобраться с указателями..

Код:
#include <stdio.h>
#include <stdlib.h>

int* create_array(unsigned int len, int start, int incr) {
int* ip = malloc(sizeof(int) * len);
if (ip) {
int val = start;
for (int i = 0; i < len; ++i, val += incr) {
ip[i] = val;
}
} return ip;
}

void print_array(int* ip, unsigned int len) {
for (int i = 0; i < len; ++i) printf(" %d", ip[i]);
printf("\n");
}

void add_array(int* a, int* b, unsigned int len) {
for (int i = 0; i < len; ++i) a[i] += b[i];
}

int main() {
int* ip1 = create_array(6, 1, 1);
int* ip2 = create_array(3, 10, 10);
if (ip1 && ip2) {
print_array(ip1 + 3, 3);
add_array(ip1 + 3, ip2, 3); print_array(ip1 + 3, 3);
add_array(ip2 + 1, ip2, 2); print_array(ip2, 3);
}
}

Выдает : 4 5 6
14 25 36
10 30 60

Не могу понять почему 60, а не 50??? Не доходит.. (

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 28.03.2018 в 15:03.
CrazyChicken вне форума Ответить с цитированием
Старый 28.03.2018, 14:58   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Изначально ip2 10 20 30
Первый проход цикла 10 30 30
Второй 10 30 60
Все как написали.
p51x вне форума Ответить с цитированием
Старый 28.03.2018, 15:32   #3
CrazyChicken
 
Регистрация: 28.03.2018
Сообщений: 3
По умолчанию

Наверное я вообще ничего не поняла..

ip2 : 10 20 30

после : add_array(ip2 + 1, ip2, 2) должно быть 10 30 50


не понимаю почему 10 30 30 а потом 10 30 60??
CrazyChicken вне форума Ответить с цитированием
Старый 28.03.2018, 15:59   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
ip2 : 10 20 30
add_array(ip2 + 1, ip2, 2) {
 a : 20 30
 b : 10 20
 len : 2

 //for (int i = 0; i < len; ++i) a[i] += b[i];
 i : 0 -> 0 < 2 -> a[0] += b[0]; -> a[0] = 10 + 20 = 30 -> т.к. a[0] = ip2[1] = b[1] = 30;
  -> a : 30 30 b : 10 30

 i : 1 -> 1 < 2 -> a[1] += b[1]; -> a[1] = 30 + 30 = 60 -> т.к. a[1] = ip2[2] = 60;
  -> a : 30 60 b : 10 30

 i : 2 -> 2 < 2 ! -> выход

 ->ip2 10 30 60
}
p51x вне форума Ответить с цитированием
Старый 28.03.2018, 16:26   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Потому что при вычислении элемента с индексом 2, который был 30, а стал 60,
элемент с индексом 1, который был 20, а стал 30 уже успел измениться
Black Fregat вне форума Ответить с цитированием
Старый 29.03.2018, 10:31   #6
CrazyChicken
 
Регистрация: 28.03.2018
Сообщений: 3
По умолчанию

Большое спасибо за подробное объяснение!!
CrazyChicken вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать программу на действия с массивами в Delphi Fanatka_1995 Помощь студентам 3 20.05.2013 12:31
Какие существуют основные действия над массивами? Женька Good Помощь студентам 2 27.12.2011 16:32
Действия над массивами hen Помощь студентам 2 06.06.2009 23:34
Действия с массивами Domik92 Паскаль, Turbo Pascal, PascalABC.NET 2 09.12.2008 13:15
Завершение действия SunKnight Общие вопросы Delphi 3 12.02.2008 18:25