путаница с указателем - PullRequest
       3

путаница с указателем

1 голос
/ 02 сентября 2010

У меня есть массив как:

int x[3][5]={
        {1,2,3,4,5},
        {6,7,8,9,10},
        {11,12,13,14,15}
        };
  1. Что означает * x?
  2. * (* x + 2) +5 относится к «8». Как это происходит?
  3. Является ли * (* x + 2) таким же, как * (* x) +2?
  4. Что если я сделаю:

    * п = & х; Где указатель n указывает на? если бы это был только x, а не &, то это был бы базовый адрес. Что сейчас?

Ответы [ 4 ]

6 голосов
/ 02 сентября 2010

*x относится к первому массиву ({1,2,3,4,5}) и эквивалентно x [0].Добавление одного к x приведет к переходу к следующему массиву, поэтому *(x+1) будет ссылаться на второй массив и будет эквивалентно x [1].

*(*x + 2), следовательно, третий элемент в первоммассив, который равен 3. Это означает, что *(*x + 2) + 5 равно 8.

Скобки очень важны, например, *(*(x+2)) будет первым элементом в третьем массиве.

*(*x + 2) приводит к тому же значению, что и *(*x) + 2, но не использует тот же элемент массива.

5 голосов
/ 02 сентября 2010
  1. *x - операция разыменования. Другими словами, «дай мне то, на что x указывает». Поскольку это массив (массивов), разыменование x даст вам первый массив. Это эквивалентно синтаксису доступа к массиву x[0].

  2. *(*x+2)+5 эквивалентно x[0][2] + 5, что дает вам 8. Это потому, что: *x совпадает с x[0] (см. # 1), а *(x + 2) совпадает с x[2]. Сделав две разыменования, вы перешли от массива массивов (аналог двойного указателя) к массиву (одиночный указатель) к фактическому числу (третий элемент в первом массиве). Тогда это просто 3 + 5 = 8.

  3. *(*x+2) эквивалентно x[0][2] (см. # 2), что равно 3 (третий элемент в массиве). Тем не менее, *(*x) + 2 дает вам x[0][0] + 2 (первый элемент в массиве плюс 2), что равно 1 + 2 = 3. Тот же ответ, но совсем другой способ его получения.

1 голос
/ 02 сентября 2010

Думайте об этом так:

typedef int Int5[5];
Int5 x[3];

x - это массив из 3 элементов. Каждый из этих трех элементов представляет собой массив из 5 дюймов.

  • Что означает * x?

x совпадает с '& x [0] so* x is the same as x [0] `, который является первым 5-элементным массивом.

  • * (* x + 2) +5 относится к «8». Как это происходит?

*x равно x [0], а x+2 равно &x[2], поэтому *x+2 равно &x[0][2] и *(*x + 2) равно x[0][2], что равно 3. Добавьте пять к этому для 8.

  • Является ли * (* x + 2) таким же, как * (* x) +2?

*(*x+2) - это x[0][2], как мы видели. *(*x) будет х [0] [0], поэтому *(*x)+2 будет x[0][0]+2. Таким образом, *(*x+2) и *(*x)+2 в конечном итоге равняются 3, но это просто совпадение.

1 голос
/ 02 сентября 2010

x - это int**, так что если у вас есть первый слой указателей, и каждый из них указывает на int* (то есть массив int).

Когда вы пишете *x, вы получаете адрес, который содержит адрес, который указывает на первую строку вашего многомерного массива.

Итак, если вы берете (*x + 2), если это похоже на ссылку на первую строку массива, а затем добавляете 2 к адресу: вы получаете адрес третьего элемента первой строки. Но так как это все еще указатель, вы добавляете внешний *(*x+2), чтобы точно получить третий элемент первой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...