将2D数组传递给带有指针的函数

时间:2018-09-17 00:49:58

标签: c pointers

#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)应该是一维指针,而不是数字?

1 个答案:

答案 0 :(得分:1)

您有几个问题。

首先,您声明func采用char **,但随后将其定义为采用int *[8],这不匹配。更糟糕的是,两者都是错误的-或者,它们与您要传递的参数类型不匹配。

除非它是sizeof或一元&运算符的操作数,否则将转换类型为“ T的N元素”的表达式 (“衰减”)到类型为“ T的指针”的表达式,该表达式的值将是第一个元素的地址。

当您将ptr传递到func时,它会从类型“ {{1}的3元素数组的2元素数组””转换为“ {的指针指向3元素的数组。 {1}}”或int。所以功能原型应该是

int

int (*)[3]

由于您的函数定义和声明不匹配,并且由于两者都不匹配参数的实际类型,因此您会得到意外的输出。您应该收到有关函数参数类型不匹配的警告;否则,您可能需要提高警告级别。