如何确定指针数组是否已在C ++ / C中填充

时间:2011-08-06 23:06:41

标签: c++ pointers if-statement

假设我有功能

  

foo(double * pa)

其中pa从[0]到[100]填充 要么 pa仅填充[0]。

我的功能执行以下操作:

  

foo(double * pa)

     

{

     

IF(pa是100的数组)THEN x [0到100] = pa [0到100]

     

ELSE x [0到100] = pa [0]

     

}

5 个答案:

答案 0 :(得分:4)

那是不可能的。 pa不是填充,因为它不是数组。它是一个指针,按照惯例,它指向数组的第一个元素。但它的类型只是pointer to double,它没有关于它是指向单个double,还是1,10,100或1000个元素的数组的信息。

“传统”解决方案是传递两个参数,指针和数组的大小:

void foo(double* pa, size_t arraysize)
{
    if (arraysize == 100) {
        ...
    }
    else {
        ...
    }
}

答案 1 :(得分:1)

鉴于foo()函数参数中的信息,无法找到:

  • “填写”
  • 的元素数量
  • pa
  • 指向的数组中的元素总数

为了实现这一目标,您需要将其他参数传递给foo()函数,该函数说明总数组有多大,以及填充了多少元素。

答案 2 :(得分:1)

问:foo()如何知道pa []是否是100的数组?

一般来说,你必须告诉它。例如:

void
foo (double *pa, int len)
{
  if (len == 100)
    ...
  else
    ...

但是,如果您使用C ++进行编码,则可以使用STL容器,例如vector:

void foo (vector<double> & pa)
{
  if (pa.size() == 100)
    ...

答案 3 :(得分:1)

根据您的previous question,结合这个问题,我认为您可能想要的只是一个过载,请看这里:

void foo_impl(double * x)
{
    // common functionality here
}

void foo(double * pa)
{
    double x[100];
    std::copy(pa, pa + 100, x);
    foo_impl(x);
}

void foo(double pa)
{
    double x[100];
    std::fill(x,x+100,pa);
    foo_impl(x);
}

这样,您可以使用指针调用foo,其中假定指向具有至少100个值的数组。或者您可以使用单个值来调用它。将通用功能放在foo_impl中的两个函数之间,这样就不会重复代码。

答案 4 :(得分:0)

你做不到。唯一foo()知道pa的是它是一个指针,无论它是否为空指针,如果它是非空的,它指向的是什么。它无法判断它是指向单个对象还是指向数组的第一个元素。

如果可能,您应该foo(),因此呼叫者必须传递其他信息:

void foo(double *pa, size_t count) {
    /* ... */
}

(注意:你应该声明foo的返回类型。)