这是我一段时间以来一直在努力的问题。 我下面尝试的代码也无法编译。
问题是:如何在函数参数中区分指针和固定数组?
{ "TraceSummaries": [], "ApproximateTime": "2018-11-18T18:00:00.000Z",
"TracesProcessedCount": 0, "NextToken": "****" }
我知道在传递给函数时数组和指针的基本相似之处,但它提出了一个问题:没有办法将它们区分开吗?
从语法上讲是,但是除此之外还有什么其他方式?
无论如何,感谢您的通读并为您的答复加油。
答案 0 :(得分:1)
这种方法对我有用:
#include <stdio.h>
template<typename T, int size> unsigned int len(const T(&)[size]) {printf("The number of items in your array is: %i\n", size); return size;}
template<typename T> unsigned int len(const T * p) {printf("The size of the item your pointer points to is: %zu\n", sizeof(*p)); return sizeof(*p);}
int main(int, char **)
{
int myArray[10];
int * myPointer = myArray;
(void) len(myArray);
(void) len(myPointer);
return 0;
}
...当我运行它时,它会打印出来:
The number of items in your array is: 10
The size of the item your pointer points to is: 4
答案 1 :(得分:1)
仅当通过引用传递数组时才能推断出数组的长度,否则它会衰减到指针:
template<typename T, std::size_t length>
constexpr std::size_t len(const T(&)[length]) { return length; }
// ^^^
template<typename T>
constexpr std::size_t len(const T *&p) { return sizeof *p; }
// ^^^
完整演示:
#include <cstdlib>
template<typename T, std::size_t length>
constexpr std::size_t len(const T(&)[length]) { return length; }
template<typename T>
constexpr std::size_t len(const T *&p) { return sizeof *p; }
#include <iostream>
int main(int, char **)
{
const int array[7] = {};
const int *pointer = array;
std::cout << "array has " << len(array) << " items\n"
<< "and pointer is to " << len(pointer) << " chars\n";
}