Передача двумерного массива в функцию с указателем - PullRequest
0 голосов
/ 17 сентября 2018
#include <stdio.h>

void func(int **);
int main(void)
{
    int ptr[2][3] = { {8, 7, 3}, {4, 5, 6} };
    printf("ptr point is %p\n", ptr);
    printf("*ptr point is %p\n", *ptr);
    func(ptr);

    system("pause");
    return 0;
}

void func(int *ptr[8])
{
    printf("ptr point is %p\n", ptr);
    printf("*ptr point is %p\n", *ptr);
    printf("*(ptr + 1) point is %p\n", *(ptr + 1));
}

Выход:

ptr point is 004FFC24
*ptr point is 004FFC24
ptr point is 004FFC24
*ptr point is 00000008
*(ptr + 1) point is 00000007
Press any key to continue

Почему ptr теперь становится 1D указателем?

Как видите
*(ptr) в func() вывод 8; *(ptr + 1) в func() выведите 7, все они являются цифрами в массиве, Однако ptr должен быть 2D указателем (поскольку [] соответствует *, следовательно, *ptr[8] должен соответствовать **ptr).
так *(ptr + 1) и *(ptr) должны быть 1D указателями, а не цифрами?

1 Ответ

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

У вас есть несколько проблем.

Сначала вы объявляете func для взятия char **, но позже определяете его для взятия int *[8], что не соответствует. Хуже того, оба они не правы - или, скорее, они не соответствуют типу аргумента, который вы передаете.

За исключением случаев, когда это операнд операторов sizeof или унарных &, выражение типа «N-элемент из T» будет преобразовано («распад») в выражение типа «указатель на T», а значением выражения будет адрес первого элемента.

Когда вы передаете ptr в func, он преобразуется из типа «2-элементный массив 3-элементного массива int» в «указатель на 3-элементный массив int», или int (*)[3]. Таким образом, прототип функции должен быть

void func( int (*ptr)[3] )

или

void func( int ptr[][3] )

Поскольку ваши определения функций и объявления не совпадают, а также потому, что ни один из них не соответствует фактическому типу аргумента, вы получите неожиданный вывод. Вы должны получить предупреждение о несоответствующих типах аргументов функции; в противном случае вам может потребоваться повысить уровень предупреждения.

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