使用括号或星号在{c + +}中声明一个双数组

时间:2015-07-02 09:17:27

标签: c++ arrays

将变量声明为:

  

double * variable;

我认为与写作

非常相似
  

双变量[];

然后是一些处理它的方法;

怎样才能获得double数组的长度? 我的意思是,我怎么知道variable的最后一个inizialized / access / written元素在哪个位置?

3 个答案:

答案 0 :(得分:4)

主要区别在于:

  • double* variable;是一个指针,意味着在执行期间动态分配(例如通过newmalloc),或者可能指向一个双重对象(那么,它不是一个“数组” “)。
  • double variable[];是一个静态分配的数组(因此在编译期间定义并修复了它的大小)。请注意,double variable[];无效作为声明。必须指定数组的大小(例如double variable[20];)。

要回答您的问题:您无法确定double*double[]变量的元素数量,除非您自己将其保存在某处。

例如,如果要将double *对象传递给函数,则需要传递指针和大小(元素数)。然后函数proptotype是( double* data, size_t size )

size_t mySize = 20;
double* data = new double[20];
callFunc( data, mySize );
delete [] data; // need to be deleted because dynamically allocated

或:

static const size_t mySize = 20;
double data[mySize];
callFunc( data, mySize );
// no need to be deleted because statically allocated

正如其他用户所评论的那样,更喜欢使用封装double *指针的std :: vector及其元素数量(以及其他属性):

std::vector<double> data;
data.assign( 20, 0.0 );
callFunc( data );
然后,

callfunc可以使用data.size()访问数据值并了解其大小。

注意:对于char *,约定是以特殊字符(\0)结束字符串,因此,在这种情况下,您可以确定size的{​​{1}}数组通过查找这个特殊字符(这就是char的作用)。您可以使用double *指针执行类似的操作(比如使用NaN来识别最后一个项目,然后恢复数组大小),但这只是一个黑客攻击,也不是传统的,也不是推荐的。

答案 1 :(得分:0)

让我纠正你。

double* foo;

声明一个指向double的指针,名为foo。

double foo[] = {1.1, 2.2, 3.3};

声明一个名为foo的双精度数组,但尚未分配任何内存。从C ++的C根源中得知的是,数组可以衰减指针。因此可以执行以下操作:

double foo[] = {1.1, 2.2, 3.3};
double bar* = foo[0];  // bar now points to the first element of foo.

但这并不意味着foo和bar是一回事。您可以使用指针迭代c数组的内容(假设您知道大小),但是有一些微妙的区域可能会让您感到沮丧(例如下面)。

您还可以执行以下操作:

double *foo;
// call something that allocates memory for an array and assigned the address of the first element to foo.

但在这种情况下,您将不得不自己跟踪数组大小。这就是为什么在C ++中,如果你使用静态分配的数组,你应该更喜欢std :: array,如果你使用动态分配的数组,你应该更喜欢std :: vector,因为这些类将处理细节比你可能更好。

有一种可爱的方式,我不建议你使用,但它是双*和双foo []之间差异的例证,Scott Meyers在&#34; Effective Modern C +中谈到了+&#34;:

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept
{
    return N;
}

double foo[] = {1.1, 2.2, 3.3};
constexpr int array_size = arraySize(foo);

将创建一个包含3个双精度的c数组,并初始化const_expr(它可能是一个变量,我使用const_expr使它明确表明这是在编译时推断出来的)array_size到你的数组的大小。

但是如果可以的话,请尽量避免使用std :: array和std :: vector。

答案 2 :(得分:0)

指针不是数组。

以下代码是一个大小为4的数组:

double arr[] {1.1, 1.2, 1.3, 1.4};

arr指的是一块内存,例如:

0x22fe20 | 0x22fe28 | 0x22fe30 | 0x22fe38 | 0x22fe40

虽然以下内容指的是arr开头的地址:

double *p_arr {arr};
  

怎样才能获得double数组的长度?

要获得大小,您可以采用arr的大小并将其除以 第一个元素的大小:

size_t arr_len = (sizeof(arr) / sizeof(*arr));

然后,我们知道最后一个初始化元素是arr_len - 1

不是自己手动查找大小,而是使用std::vector更好更安全:

std::vector<double> arr {1.1, 1.2, 1.3, 1.4};
std::cout << arr.size();