Арифметика суфлеров с договоренностями в C ++

У меня есть маленькое сомнение в том, что происходит с этим суфлером, код - следующий:

#include <iostream>
using namespace std;
void func(int *, int);

int main(int argc, char *argv[])
{
    int i, a[10]={1,2,3,2,5};
    func(a,4);              
    for(i=0; i<=4; i++)
        cout<<a[i]<<endl;
    return 0;
}

void func(int *b,int n)                                     
{
    int i;
    for(i=0; i<=n; i++)
    {        
       if(b[i]==2) {
         b=b+1;                 
         b[i]=b[i]*2;       
       }                            
    }   
}   

Точно в этой линии кода, у меня не остается очень ясным, что является тем, что он перемещает:

void func(int *b,int n)                                   
{
    int i;
    for(i=0; i<=n; i++)
    {        
        if(b[i]==2) {
           b=b+1;                 
           b[i]=b[i]*2;     
        }                           
    }
}   

В этой линии, когда i=1, будешь входить в if потому что стоимость b[1] он равен в 2, но, в этом случае, суфлер продолжает указывать на стоимость 0, верный?: или он двигался?, потому что, когда я скроллирую программу, первый и вторая стоимость не меняются, но третья стоимость, которая 3 он это печатает как 6, когда он был бы должен печатать: верный?.

Вкратце, эта это линии, которые у меня не остаются очень ясными:

b=b+1;
b[i]=b[i]*2;

Он прокручивается и распределяет стоимость в b[i]?

0
задан 08.06.2017, 17:27
2 ответа

Ключ - линия b = b + 1, именно здесь ты продвигаешь положение указателя в договоренность, из-за которого в следующей линии, когда ты ссылаешься b[i] уже это не тот же элемент. Чтобы это иллюстрировать:

como avanza el puntero

Когда ты оценил b[1] было элемента со стоимостью 2, но после изменяя указатель b[1] сейчас ссылается на элемент со стоимостью 3 и этот тот, которого ты удваиваешь.

3
ответ дан 24.11.2019, 12:44
  • 1
    #161; и #161; Большое спасибо!! Превосходный explicaci и # 243; n. Очень благодарный друг – osmodiar16 05.11.2016, 06:38

Когда ты реализуешь сравнение b[i], b продолжи быть указанным в 1. Ты не ошибаешься.

b[i] он эквивалентный в *(b + i)следовательно, он возвращается в стоимость положения i-ésima вектора, но стоимости b он не изменился (b + i он не подразумевает b += i). Так что b продолжи быть указанным в 1 вслед за сравнением.

Потом, ты реализуешь ассигнование b = b + 1, делая, что b заметка в 2. Как b сейчас обозначься в 1, b[1] (i еще стой 1), он возвратит ссылку на третий элемент, который ты умножаешь из-за 2, получая один 6.

1
ответ дан 24.11.2019, 12:44