2015-04-27 8 views
-1
#include <iostream> 
using namespace std; 
int main(int argc, _TCHAR* argv[]) 
{ 
    int a[10]={0,1,2,3,4,5,6,7,8,9}; 
    int *aptr; 
    aptr = &a[0]; 
    a[2] = a[2] + 3; 
    a[3] = a[5] + a[4]; 
    aptr++; 
    (*aptr)--; 
    (*(++aptr))++; 
    cout << a[1] << a[2] << a[3] << a[4] << *aptr << endl; 
} 

Проблема заключается в том, что, предполагая, что приведенный выше код компилируется, я должен получить результат 06946. Может ли кто-нибудь пройти через код для меня? Я не совсем понимаю, как код поступает на выход?C++ указатели и арифметика

ответ

1
int main(int argc, _TCHAR* argv[]) 
{ 
    int a[10]={0,1,2,3,4,5,6,7,8,9};  
    // a is an array of 10 ints. 
    int *aptr; 
    // aptr is a pointer to int. 
    aptr = &a[0]; 
    // aptr points to the 1st element of a array. i.e. a[0] 
    a[2] = a[2] + 3; 
    // You add 3 to a[2], i.e. third element of array to get '5' and put it back in a[2]. 
    // So 'a' will be {0,1,5,3,4,5,6,7,8,9} 
    a[3] = a[5] + a[4]; 
    // You take 6th and 5th elements, add them and put it in 4th element. 
    // So 'a' will be {0,1,5,9,4,5,6,7,8,9} 
    aptr++; 
    // aptr pointer is incremented so now it points to 2nd element of a array i.e a[1]. 
    (*aptr)--; 
    // aptr pointer is first dereferenced to get a[1], which is then decremented. 
    // So 'a' will be {0,0,5,9,4,5,6,7,8,9} 
    (*(++aptr))++; 
    // aptr pointer is incremented first so now it points to 3rd element i.e. a[2]. 
    // aptr pointer is then dereferenced to get a[2], which is then incremented. 
    // So 'a' will be {0,0,6,9,4,5,6,7,8,9} and aptr points to a[2] 
    cout << a[1] << a[2] << a[3] << a[4] << *aptr << endl; 
    // So it should print 06946 
} 
0

Давайте пройдемся по каждому шагу в коде:

int a[10]={0,1,2,3,4,5,6,7,8,9}; //initial state of your array 
int *aptr; 
aptr = &a[0]; //pointer on the first element 
a[2] = a[2] + 3; //a[2]=5 now 
a[3] = a[5] + a[4]; //a[3]=9 now 
aptr++; //pointer on the second element 
(*aptr)--; //decrement the value pointed by the pointer: a[1]=0 now 
(*(++aptr))++; 
//first increment the pointer the increments the value pointed by the new pointer so a[2]=6 now 

Заметим, что последняя строка может иметь различное поведение, так как он содержит постфикса и префикса приращения, но так как они находятся на двух различных значениях она должна быть безопасной ,

-1
int a[10]={0,1,2,3,4,5,6,7,8,9}; 
int *aptr; 
aptr = &a[0]; 

aptr ссылается a[0]

a[2] = a[2] + 3; 
// a[2] == 5 
a[3] = a[5] + a[4]; 
// a[3] == 9 
aptr++; 

перемещение ссылки aptr «S к a[1]

(*aptr)--; 

Символ * перед тем aptr означает теперь вы изменяете то, что он ссылается VALUE то'с , Так aptr указывает на a[1], и мы будем уменьшать его значение на 1. Поэтому a[1] равен 0.

(*(++aptr))++; 

Давайте сломаем это вниз. (++aptr) означает, что сдвиг курсора мыши из a[1] в a[2]. (*(++aptr)) теперь говорит, что позволяет сосредоточиться на aptr VALUE. Теперь мы знаем a[2] == 5. Наконец (*(++aptr))++ говорит, что позволяет увеличить это значение на 1. Таким образом, a[2] == 6. Имейте в виду, что *aptr ТЕПЕРЬ также равна 6 в результате этого.

cout << a[1] << a[2] << a[3] << a[4] << *aptr << endl; 

Таким образом, мы установили, что значение a[1] «s было изменено на 0. Мы определили, почему a[2] == 6, a[3] является 9 из простой математики и, наконец *aptr == 6, потому что это последняя операция мы провели на нашем указателе.

Я надеюсь, что это поможет вам понять ваше упражнение.

Смежные вопросы