sizeof - 将指针转换为数组

sizeof - convert a pointer to an array

本文关键字:数组 转换 指针 sizeof      更新时间:2023-10-16

可能的重复项:
如何查找 sizeof(指向数组的指针)

我有以下代码

int myfunc(char *arr)
{
const int sizearr = sizeof( arr ) / sizeof(char);
}

这会产生指针的大小,而不是我传递给函数的 char 数组[17] 的大小。

我知道我可能会使用 strlen 并解决问题,但是有没有办法将 char*arr 指针转换回我传递给函数的 char 数组[17]以使用 sizeof(char array[17])?

如果要传递一个包含 17 个字符的数组,则需要通过引用传递它(仅限C++):

int myfunc(char (&arr)[17])
{
    unsigned int const sizearr = sizeof arr;
    // ...
}

或者做一个模板来推断大小:

template <unsigned int sizearr>
int myfunc(char (&arr)[sizearr])
{
    // ...
}

在 C 中,您根本不能将数组作为参数传递,因此有责任单独传达数组大小。

更新:正如@David所建议的,您可以通过传递指向数组的指针来修复 C 中的数组类型:

int myfunc(char (*arr)[17])
{
    unsigned int const sizearr = sizeof *arr;
    // ...
}
int main()
{
    char s[17];
    return myfunc(&s);
}

不,没有这样的方法。但是在C++中,您可以按数组大小参数化函数模板,并通过引用传递数组:

template <size_t size> void myfunc(char (&arr)[size])
{
   for(size_t i = 0; i < size; ++i) std::cout << arr[i];
}
// Usage
char array[] = "My char array";
myfunc(array);

No.

没有这样的办法。类型 char * 不包含有关"源"(即数组)的任何信息。这就是为什么说数组"衰减"成指针的原因;指针包含的信息少于数组。

此外,sizeof (char)为 1。

不是真的,因为一旦数组衰减到指针,有关其"原始"形式的所有信息都会丢失。您始终可以将指针投射到char[17]但这是不好的做法。

如果确实需要数组,请更改函数签名以接受数组。