2014-12-10 3 views
-3

У меня есть код, который я пытаюсь проанализировать, чтобы изучить указатели, и я хотел бы попросить о помощи, правильно ли я его интерпретирую, и если я не могу кого-то помогите интерпретировать это для меня, потому что я все еще нахожу указатели, чтобы сбивать с толку. Вы сможете увидеть мои интерпретации сразу после //.Указатели на понимание С ++

int main() 
{ 
    int x = 5; 
    int y = 3; 
    int a[] = {5, 10, 15}; 

    PointerMystery(&x, y, a); 
    cout << x << " " << y << endl; 

    for (int i = 0; i < 3; i++) { 
     cout << a[i] << " "; 
    } 
    cout << endl; 

    return 0; 
} 

void PointerMystery(int *pa, int b, int c[]) { 
// *pc will return array c 
    int *pc = c; 

// *pa which returns the address of x will now make x = 20.  
    *pa = 20; 
// b which was 3 is now equal to 15, therefore y = 15 
    b = 15; 
// *pc which returned a array is now 15(im not so sure about this?) 
    *pc = b; 
// im not sure what is happening here either? 
    pc += 2; 
// *pc will return the value (20) - 10? 
    *pc = *pa - 10; 

    cout << *pa << " " << b << " " << *pc << endl; 
    for (int i = 0; i < 3; i++) { 
     cout << c[i] << " "; 
    } 
    cout << endl; 
} 
+1

Вы можете легко проверить свои мысли. – Maroun

+0

'pc + = 2;' перемещает вас по двум местам в массиве 'c []'. Будьте осторожны, чтобы не пропустить конец массива. Google «Арифметика указателей» для получения более подробной информации. – Bathsheba

+1

Массивы распадаются на указатели при передаче в качестве аргументов функций, поэтому в функции переменная 'c' уже является указателем. И при использовании оператора разыменования вы не получаете адрес указателя, вы получаете значение того, на что оно указывает. Чтобы получить адрес, хранящийся в указателе, просто используйте сам указатель (указатели - это, по сути, целые переменные, значение которых является адресом). –

ответ

2

Переменные указателя - это то, что подразумевают их имена, переменные, которые указывают на что-то.

Это может быть проще понять, если вы думаете об этом графически и шаг за шагом. Так что ...


Когда функция PointerMystery называется у вас есть переменные pa, b и c:

 
+----+  +---+ 
| pa | --> | 5 | 
+----+  +---+ 

+---+ 
| 3 | 
+---+ 

+---+  +----+----+----+ 
| c | --> | 5 | 10 | 15 | 
+---+  +----+----+----+ 

После назначения pc у вас есть

 
+---+ 
| c | --\ 
+---+ \ +----+----+----+ 
      >-> | 5 | 10 | 15 | 
+----+ / +----+----+----+ 
| pc | -/ 
+----+ 

Затем вы делаете *pa = 20; поэтому у вас есть

 
+----+  +----+ 
| pa | --> | 20 | 
+----+  +----+ 

Тогда вы *pc = b;, где b является 15, а с pc действительно просто указывает на первый элемент переданного массива, что означает, что вы изменить первый элемент:

 
+---+ 
| c | --\ 
+---+ \ +----+----+----+ 
      >-> | 15 | 10 | 15 | 
+----+ / +----+----+----+ 
| pc | -/ 
+----+ 

Вы затем увеличиваем указатель pc, чтобы указать на третьего элемент переданного массива:

 
+---+  +----+----+----+ 
| c | --> | 15 | 10 | 15 | 
+---+  +----+----+----+ 
        ^
+----+    | 
| pc | -------------/ 
+----+ 

Вы затем изменить значение, где pc указывает на значение где pa указывает минус 10 , а значение pa указывает 20, которое дает 10 после вычитания:

 
+---+  +----+----+----+ 
| c | --> | 15 | 10 | 10 | 
+---+  +----+----+----+ 
        ^
+----+    | 
| pc | -------------/ 
+----+ 

Другие вещи, которые могут быть полезны для указания указателей, заключается в том, что массивы распадаются на указатели на их первый элемент, когда вы передаете их функции. Вот почему c - это указатель и где он указывает.

Кроме того, вы можете использовать синтаксис индексации и синтаксис указателя как для массивов, так и для указателя. Вы можете сделать это для массивов, так как они разлагаются на указатели на их первый элемент, а для указателей - на короткую руку для *(ptr + x). Фактически, для обоих указателей и массивов *(ptr_or_array + x) эквивалентен ptr_or_array[x].

Последний бит также объясняет, почему добавление два к pc указателя делает это указывает на элемент третьего, *(pc + 0) эквивалентно pc[0] и *(pc + 2) эквивалентно pc[2], что, поскольку индексы массива равны нулю на основе является третьим элементом.

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