Как определяется элемент, обозначенный * (arr + i) [1] и ** (arr + i)? - PullRequest
1 голос
/ 07 апреля 2019

Я не могу понять, как определяются следующие элементы:

  1. *(arr+1)[1] - напечатано 7.

  2. **(arr+1) - 4 напечатано.

#include <stdio.h>
int main()
{
    int arr[3][3]={1,2,3,4,5,6,7,8,9};
    printf("%d %d",*(arr+1)[1],**(arr+1));
    return 0;
}

Ответы [ 2 ]

5 голосов
/ 07 апреля 2019

По определению, a[b] эквивалентно *(a + b).

[] (постфикс) имеет более высокий приоритет, чем * (префикс), поэтому *a[b] анализируется как *(a[b]).

  1. *(arr+1)[1] разбирается как *((arr+1)[1]).

    *((arr+1)[1]) эквивалентно *(*(arr+1+1)).

    *(*(arr+1+1)) уменьшается до **(arr+2).

    **(arr+2) эквивалентно *(arr[2]).

    *(arr[2]) эквивалентно *(arr[2]+0).

    *(arr[2]+0) эквивалентно arr[2][0].

  2. **(arr+1) эквивалентно *(arr[1]).

    *(arr[1]) эквивалентно *(arr[1]+0).

    *(arr[1]+0) эквивалентно arr[1][0].

Что касается фактических данных:

int arr[3][3]={1,2,3,4,5,6,7,8,9};

немного трудно читать.Лучше:

int arr[3][3]={
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

В первом случае arr[2][0] дает вам первый элемент (7) третьего подмассива (7,8,9), а во втором случае arr[1][0] дает вампервый элемент (4) второго подмассива (4,5,6).

1 голос
/ 07 апреля 2019

arr может быть написано более интуитивно следующим образом:

 int arr[3][3]={
     {1,2,3},
     {4,5,6},
     {7,8,9},
 };

*(arr+1)[1] эквивалентно **(arr+2), поскольку a[n] эквивалентно *(a+n).arr+2 пропускает две строки, давая указатель на {{7,8,9}}, затем две звезды разыменовывают первое из этих значений.

**(arr+1) работает аналогично.

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