Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sizeof-将指针转换为数组_C++_C - Fatal编程技术网

C++ sizeof-将指针转换为数组

C++ sizeof-将指针转换为数组,c++,c,C++,C,可能重复: 我有以下代码 int myfunc(char *arr) { const int sizearr = sizeof( arr ) / sizeof(char); } 这会产生指针的大小,而不是我传递给函数的字符数组[17]的大小 我知道我可以使用strlen来解决这个问题,但是有没有办法将char*arr指针转换回我传递给函数的char数组[17],以便使用sizeofchar数组[17]?否 没有这样的办法。类型char*不包含任何有关源(即数组)的信息。这就是为什么说数组会退

可能重复:

我有以下代码

int myfunc(char *arr)
{
const int sizearr = sizeof( arr ) / sizeof(char);
}
这会产生指针的大小,而不是我传递给函数的字符数组[17]的大小

我知道我可以使用strlen来解决这个问题,但是有没有办法将char*arr指针转换回我传递给函数的char数组[17],以便使用sizeofchar数组[17]?

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


另外,sizeof char是1。

不是真的,因为一旦数组有了关于其原始形式的所有信息,就丢失了。您总是可以将指针投射到字符[17],但这是一种糟糕的做法


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

如果要传递17个字符数组,则只需要通过引用C++传递:

int myfunc(char (&arr)[17])
{
    unsigned int const sizearr = sizeof arr;
    // ...
}
或者制作一个模板来推断尺寸:

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

不,没有这种办法。但是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);

字符的FYI大小为1。所以这无论如何都不行。+1恢复大小的方法是永远不要松开它:在C中,如果通过指针传递数组,基本上也可以这样做,但大小将在编译时固定@DavidRodríguez dribeas:关于按地址传递数组的观点很好。我加上了!
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);