C++ 我可以用C+;确定数组的大小/长度吗+;不需要硬编码?
我基本上是在寻找某种“动态”方式,将数组的大小/长度传递给函数C++ 我可以用C+;确定数组的大小/长度吗+;不需要硬编码?,c++,arrays,C++,Arrays,我基本上是在寻找某种“动态”方式,将数组的大小/长度传递给函数 我试过: void printArray(int arrayName[]) { for(int i = 0 ; i < sizeof(arrayName); ++i) { cout << arrayName[i] << ' '; } } void打印数组(int-arrayName[] { 对于(int i=0;i类,它还有其他的优点。 TL;DR回答:使用
我试过:
void printArray(int arrayName[])
{
for(int i = 0 ; i < sizeof(arrayName); ++i)
{
cout << arrayName[i] << ' ';
}
}
void打印数组(int-arrayName[]
{
对于(int i=0;i 在C++中,太长了,读不下去了,在运行时不可能知道数组的大小。如果需要,可以考虑使用<代码> STD::vector < /Cuff>类,它还有其他的优点。 TL;DR回答:使用<代码> STD::向量< /代码> .<
但是我意识到它[sizeof()
]只考虑它的字节大小,而不考虑数组中有多少元素
这本身并不是问题:您仍然可以使用sizeof(array)/sizeof(array[0])
获得数组的大小,但问题是当传递给函数时,数组会衰减为指向其第一个元素的指针,因此您所能得到的只是sizeof(t*)
(t是数组中元素的类型)
关于*arrayName++
:
这至少把我所有的东西都印出来了,但比我想象的要多
我甚至不明白是什么促使你用这种方式计算数组的大小。这段代码所做的就是增加数组中的第一个对象,直到它为零
运行程序几次后,我意识到我输入的数组最后一个元素后的值始终是:-858993460
这是一个糟糕的假设,它还依赖于未定义的行为。你不能真正确定数组的第一个元素之后内存中有什么,你甚至不应该访问它
基本上,在C++中,如果你想从函数中知道原始数组的大小,那么你必须手动跟踪它(例如,添加一个额外的<代码> sisigt大小< /Cord>参数),因为数组被传递给函数(记住,它们“衰变成指针”)。如果你想要更灵活的东西,考虑从C++标准库中使用<代码> STD::或者向量你想存储的任何类型的对象——它有一个<代码> siz()/<代码>方法,它正好符合你想要的。 < P>当你把数组的长度传递到<代码> PrimaTray< /Cord>,你可以使用<代码> siZeof(数组)/siZeof(数组)[0])
,也就是说,整个数组的字节大小除以单个元素的字节大小,就得到了数组本身的元素大小
<> P>更重要的是,在C++中,你可能会发现学习和更喜欢这些原始数组,这是你的优势,除非你正在做一个家庭作业,要求你学习原始数组。成员函数会给你矢量中的元素数量。使用-858993460值是非常不可靠的。事实上,不正确
可以通过两种方式传递数组的长度:传递附加参数(例如
size\u t length
),或者在数组的末尾加上一个特殊的值。首选第一种方法,但使用第二种方法,例如,按char*传递字符串,正如所有其他答案所说,您应该使用std::vector
,或者像您已经做的那样,将数组的元素数传递给打印函数
另一种方法是将sentinel元素(一个您确信它不会在数组中的值)放在数组的末尾。然后在打印函数中循环遍历元素,找到sentinel后停止打印。一种可能的解决方案:您可以使用模板推断数组长度:
template <typename T, int N>
int array_length(T (&array)[N]) {
return N;
}
关键是模板化构造函数不是显式的,因此可以将数组转换为实例,捕获大小,然后衰减为指针
注意:所示的包装器不适合拥有动态大小的数组,只是为了方便地处理静态大小的数组。为了简洁起见,它还缺少各种运算符和默认构造函数。一般来说,对于一般用途,首选std::vector
或std::array
…OP自己的尝试完全在别处解决…在C/C++中,本机数组一传递到函数,就降级为指针。因此,“length”参数必须作为函数的参数传递 C++提供std::vector集合类。确保在将其传递给函数时,通过引用或指针传递(以避免在传递数组时复制数组)
#包括
#包括
void printary(std::vector和arrayName)
{
size_t length=arrayName.size();
对于(尺寸i=0;isizeof
会得到它的字节大小,然后除以每个元素的字节大小,得到元素的数量。但是现在,由于你有一个指针而不是数组,所以调用sizeof
只会给出大小指针(通常是4或8个字节)的数组,而不是数组本身,这就是失败的原因
第二次尝试
本例中的while循环假设数组以零结尾,这是非常糟糕的(除非您确实使用了零作为终止符,例如以null结尾的字符串)如果您的数组没有以零结束,则可能访问的不是内存,因此调用未定义的行为。可能发生的另一件事是,您的数组在中间有一个零元素,然后只打印前几个元素。
第三次尝试
你在数组末尾发现的这个特殊值可以随时更改。这个值正好在这里,下次可能会不一样,所以像这样硬编码是非常危险的,因为同样,你可能会访问不属于你的内存
您的最终代码
此代码是正确的,并传递数组的长度al
void printArray(int *arrayName)
{
while (*arrayName)
{
if (*arrayName == -858993460)
{
break;
}
cout << *arrayName << ' ';
*arrayName++;
}
cout << '\n';
}
include <iostream>
include <conio.h>
using namespace std;
// functions prototypes
void printArray (int arrayName[], int lengthArray);
// global variables
//main
int main ()
{
int firstArray[] = {5, 10, 15};
int secondArray[] = {2, 4, 6, 8, 10};
printArray (firstArray,3);
printArray (secondArray,5);
// end of program
_getch();
return 0;
}
// functions definitions
void printArray(int arrayName[], int lengthArray)
{
for (int i=0; i<lengthArray; i++)
{
cout << arrayName[i] << " ";
}
cout << "\n";
}
template <typename T, int N>
int array_length(T (&array)[N]) {
return N;
}
template <typename T>
struct array {
T *a_;
int n_;
template <int N> array(T (&a)[N]) : a_(a), n_(N) {}
};
void printArray(array<int> a)
{
for (int i = 0 ; i < a.n_; ++i)
cout << a.a_[i] << ' ';
}
int firstArray[] = {5, 10, 15};
int secondArray[] = {2, 4, 6, 8, 10};
printArray (firstArray);
printArray (secondArray);
#include <vector>
#include <string>
void printArray(std::vector<std::string> &arrayName)
{
size_t length = arrayName.size();
for(size_t i = 0 ; i < length; ++i)
{
cout << arrayName[i] << ' ';
}
}
int main()
{
std::vector<std::string> arrayOfNames;
arrayOfNames.push_back(std::string("Stack"));
arrayOfNames.push_back(std::string("Overflow"));
printArray(arrayOfNames);
...
}
#include <iostream>
#include <vector>
#include <cstddef>
void print_vec(const std::vector<int>& v)
{
std::size_t len = v.size();
for (std::size_t i = 0; i < len; ++i)
{
std::cout << v[i] << std::endl;
}
}
int main()
{
std::vector<int> elements;
elements.push_back(5);
elements.push_back(4);
elements.push_back(3);
elements.push_back(2);
elements.push_back(1);
print_vec(elements);
return 0;
}