Действительно ли [i] совпадает с * (a + i) в C? - PullRequest
0 голосов
/ 17 октября 2018
#include <stdio.h>
int sum2d(int row, int col, int p[row][col]);
int main(void)
{
    int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

    printf("%d\n", sum2d(2, 3, a));


    return 0;
}
int sum2d(int row, int col, int p[row][col])
{
    int total = 0;
    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++)
            total += (*(p + i))[j];
    return total;
}

Посмотрите на приведенный выше код.Это прекрасно работает.

Однако после того, как я изменил p [row] на * (p + row) ,

#include <stdio.h>
int sum2d(int row, int col, int (*(p + row))[col]);
int main(void)
{
    int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

    printf("%d\n", sum2d(2, 3, a));


    return 0;
}
int sum2d(int row, int col, int (*(p + row))[col])
{
    int total = 0;
    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++)
            total += (*(p + i))[j];
    return total;
}

, он можетне компилируется и отображает следующее сообщение об ошибке:

test.c:2:38: error: expected ‘)’ before ‘+’ token
 int sum2d(int row, int col, int (*(p + row))[col]);
                                      ^
test.c: In function ‘main’:
test.c:7:2: warning: implicit declaration of function ‘sum2d’ [-Wimplicit-function-declaration]
  printf("%d\n", sum2d(2, 3, a));
  ^
test.c: At top level:
test.c:12:38: error: expected ‘)’ before ‘+’ token
 int sum2d(int row, int col, int (*(p + row))[col])

На моем текущем уровне, я едва понимаю его.

В C, я думал, a [i] = * (a + i) .

Почему мой код неверен?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Синтаксис правильный, когда [] используется как оператор подписки массива postfix, а не как декларатор массива.

Цитирование C11, глава §6.5.2.1

Выражение постфикса, за которым следует выражение в квадратных скобках [] - это подписанное обозначение элемента объекта массива.Определение подстрочного оператора [] состоит в том, что E1[E2] идентичен (*((E1)+(E2))).Из-за правил преобразования, которые применяются к двоичному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта массива) и E2 является целым числом, E1[E2] обозначаетE2 -й элемент E1 (считая с нуля).

0 голосов
/ 17 октября 2018

Выражение a[i] равно выражению *(a + i).Использование арифметического указателя в объявлениях недопустимо.

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