创建和初始化数组的更好(更有效)的方法是什么?
1. int array[3] {1,2,3};
2. int *array=new int[3]{1,2,3};
答案 0 :(得分:3)
不要认为"更好"永远意味着更高效!在函数体中,这两者做了很多不同的事情:
int array[3] {1,2,3};
第一个分配本地存储(在堆栈上),该函数将在函数终止时释放。 (所以你不应该试图在那个生命周期之外使用它。)
int *array = new int[3] {1,2,3};
第二个分配新堆内存,当函数终止时不会释放。 (所以当你不再需要它时,你应该记得delete[]
)
答案 1 :(得分:1)
最好的方法是:
int array[3] = {1,2,3}; // assignment operator added
在您的示例中,只有第一个是数组:
int array[3];
第二个是指定了运算符new
返回的地址的指针。要查看差异,请尝试sizeof(array)
:
int array[3];
cout << sizeof(array) << endl;
我的编译器显示12(即3 * sizeof(int),数组大小取决于元素数量),但
int *array=new int[3];
cout << sizeof(array) << end
我的编译器显示4(即sizeof(int *),指针大小仅取决于平台)
答案 2 :(得分:0)
让我们从第二个开始。
<?php
// get the records from the database
if ($result = $con->query("
SELECT inventory.InventoryID, descriptorid.dename, typeid.tyname,
inventory.Serial, inventory.ServiceTag, inventory.CityTag,
conditioncid.conname, statusid.statusname, locationid.locname,
stationid.stationname, users.Fname, users.Lname,
inventory.PurchaseDate, inventory.POnumber
FROM inventory
LEFT JOIN descriptorid
ON inventory.Descriptor = descriptorid.dename
LEFT JOIN typeid
ON inventory.Type = typeid.tyname
LEFT JOIN conditioncid
ON inventory.ConditionC = conditioncid.conname
LEFT JOIN statusid
ON inventory.Status = statusid.statusname
LEFT JOIN locationid
ON inventory.Location = locationid.locname
LEFT JOIN stationid
ON inventory.Station = stationid.stationname
LEFT JOIN users
ON inventory.cuserFname = users.Fname
AND inventory.cuserLname = users.Lname "))
{
// display records if there are records to display
if ($result->num_rows > 0)
{
// display records in a table
echo "<table border id='myTable' class='tablesorter' >";
// set table headers
echo "<thead><th>ID</th><th>Descriptor</th><th>Type</th><th>Serial</th><th>ServiceTag</th><th>CityTag</th><th>Condition</th><th>Status</th><th>Location</th><th>Station</th><th>CurrentUser</th><th>Lastname</th><th>PurchaseDate</th><th>POnumber</th><th></th><th></th></thead>";
echo "<tbody";
while ($row = $result->fetch_object())
{
// dump whats returned
// print_r($row);
echo "<tr>";
echo "<td>" . $row->InventoryID . "</td>";
echo "<td>" . $row->Descriptor . "</td>";
echo "<td>" . $row->Type . "</td>";
echo "<td>" . $row->Serial . "</td>";
echo "<td>" . $row->ServiceTag . "</td>";
echo "<td>" . $row->CityTag . "</td>";
echo "<td>" . $row->ConditionC . "</td>";
echo "<td>" . $row->Status . "</td>";
echo "<td>" . $row->Location . "</td>";
echo "<td>" . $row->Station . "</td>";
echo "<td>" . $row->cUserFname . "</td>";
echo "<td>" . $row->cUserLname . "</td>";
echo "<td>" . $row->PurchaseDate . "</td>";
echo "<td>" . $row->POnumber . "</td>";
echo "<td><a href='invrecords.php?InventoryID=" . $row->InventoryID . "'><img src='img/default/button_mini_ticket_edit.gif'></a></td>";
echo '<td><a href="javascript:void(0);" onclick="confirmation(' . $row->InventoryID . ');"><img src="img/default/button_mini_delete.gif"></a>';
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
;
它创建了一个动态数组。“动态”意味着内存将在运行时分配,而不是在编译时分配。因此,上面的初始化将创建一个大小为3的数组,并将使用给定的值进行初始化。记住动态分配的内存没有预定义的范围,因此需要使用'delete'运算符释放内存。使用指针时也要小心,因为如果使用不当,它们可能会在程序中造成严重破坏!
现在是第一个。
int *array = new int[3] {1,2,3}
它创建一个大小为3的数组,并使用给定的值对其进行初始化。在这种情况下,内存是静态分配的(在编译期间)。只要程序继续,变量就会停留在内存中然后消失! 因此,您可以根据需要决定阵列初始化的类型。