将变量声明为:
double * variable;
我认为与写作
非常相似双变量[];
然后是一些处理它的方法;
怎样才能获得double数组的长度?
我的意思是,我怎么知道variable
的最后一个inizialized / access / written元素在哪个位置?
答案 0 :(得分:4)
主要区别在于:
double* variable;
是一个指针,意味着在执行期间动态分配(例如通过new
或malloc
),或者可能指向一个双重对象(那么,它不是一个“数组” “)。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();