在函数参数中区分数组和指针-C ++

时间:2018-11-21 06:24:12

标签: c++

这是我一段时间以来一直在努力的问题。 我下面尝试的代码也无法编译

问题是:如何在函数参数中区分指针和固定数组?

{ "TraceSummaries": [], "ApproximateTime": "2018-11-18T18:00:00.000Z", 
 "TracesProcessedCount": 0, "NextToken": "****" }

我知道在传递给函数时数组和指针的基本相似之处,但它提出了一个问题:没有办法将它们区分开吗?

从语法上讲是,但是除此之外还有什么其他方式?

无论如何,感谢您的通读并为您的答复加油。

2 个答案:

答案 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";
}