我正在写一个简单的函数,它返回数组中最大的整数。我遇到的问题是求出数组中元素的个数。函数标题如下:
int largest(int *list, int highest_index)
我怎么才能得到数组'list'中的整数个数。我试过以下方法:
int i = sizeof list/sizeof(int); //returns incorrect value int i = list.size(); // does not compile
任何帮助将不胜感激!
qyuhtwio1#
C++基于C语言,继承了C语言的许多特性。关于这个问题,它继承了一个叫做“数组/指针等价”的规则,这是一个允许数组退化为指针的规则,特别是当它作为函数参数传递时。这并不意味着数组 * 是 * 指针,它只是意味着它可以退化为一个指针。
void func(int* ptr); int array[5]; int* ptr = array; // valid, equivalent to 'ptr = &array[0]' func(array); // equivalent to func(&array[0]);
最后一部分与你的问题最相关。你传递的不是数组,而是第0个元素的地址。为了让您的函数知道传入数组的大小,您需要将该信息作为参数发送。
static const size_t ArraySize = 5; int array[ArraySize]; func(array, ArraySize);
因为指针不包含大小信息,所以不能使用sizeof。
void func(int* array) { std::cout << sizeof(array) << "\n"; }
这将输出“int*”的大小-根据32位与64位,该大小为4或8字节。相反,您需要接受大小参数
void func(int* array, size_t arraySize); static const size_t ArraySize = 5; int array[ArraySize]; func(array, ArraySize);
即使你试图传递一个固定大小的数组,结果也是语法上的糖衣炮弹:
void func(int array[5]);
http://ideone.com/gaSl6J还记得我说过数组不是指针,只是等价的吗?
int array[5]; int* ptr = array; std::cout << "array size " << sizeof(array) << std::endl; std::cout << "ptr size " << sizeof(ptr) << str::endl;
数组大小将是5 * sizeof(int)= 20指针大小将是sizeof(int *),其将是4或8字节。
如果你想知道数组中有多少个元素,当你有数组而不是指针时,你可以写
sizeof(array) / sizeof(array[0])
或sizeof(数组)/ sizeof(* 数组)
zz2j4svz2#
这是使用向量而不是数组的一个很好的理由。但是如果你必须使用数组,那么你必须把数组的大小作为参数传递给你的函数
int largest(int *list, int list_size, int highest_index)
数组在C++中是相当差的,你越早学会使用向量,你就越容易找到东西。
qlckcl4x3#
指针没有关于它们所引用的元素数量的信息。如果你说的是函数调用的第一个参数,那么如果list是一个数组,你确实可以使用下面的语法
sizeof( list ) / sizeof( int )
我想补充的是有三种方法。第一种是使用数组通过引用传递。第二种是使用指向第一个元素的指针和元素的数量。第三种是使用两个指针-开始指针和最后指针,因为标准算法通常是定义的。字符数组有一个额外的可能性来处理它们。
64jmpszr4#
答案很简单,你不能。你需要把它存储在一个变量中。C++的最大优势是它有STL,你可以使用vector。size()方法给出了那个时刻向量的大小。
#include<iostream> #include<vector> using namespace std; int main () { vector<int> v; for(int i = 0; i < 10; i++) { v.push_back(i); } cout << v.size() << endl; for(int i = 0; i < 10; i++) { v.push_back(i); } cout << v.size() << endl; return 0; }
输出:10个20未测试。但应该可以。)
4jb9z9bj5#
你需要记住在一个可变数组大小中,不可能从指针中检索数组大小。
const int SIZE = 10; int list[SIZE]; // or int* list = new int[SIZE]; // do not forget to delete[]
swvgeqrz6#
我的答案使用了一个字符数组而不是整数数组,但我希望它能有所帮助。您可以使用计数器直到到达数组结尾。字符数组总是以'\0'结尾,您可以使用它来检查是否到达数组结尾。
char array[] = "hello world"; char *arrPtr = array; char endOfString = '\0'; int stringLength = 0; while (arrPtr[stringLength] != endOfString) { stringLength++; } stringLength++; cout << stringLength << endl;
现在你有了char数组的长度。我试着用这个方法计算数组中的整数个数。显然,'\0'在这里显然不适用,但是数组的-1索引是0。所以假设在你使用的数组中没有0。你可以在代码中用0替换'\0',并将代码改为使用int指针和数组。
6条答案
按热度按时间qyuhtwio1#
C++基于C语言,继承了C语言的许多特性。关于这个问题,它继承了一个叫做“数组/指针等价”的规则,这是一个允许数组退化为指针的规则,特别是当它作为函数参数传递时。这并不意味着数组 * 是 * 指针,它只是意味着它可以退化为一个指针。
最后一部分与你的问题最相关。你传递的不是数组,而是第0个元素的地址。
为了让您的函数知道传入数组的大小,您需要将该信息作为参数发送。
因为指针不包含大小信息,所以不能使用sizeof。
这将输出“int*”的大小-根据32位与64位,该大小为4或8字节。
相反,您需要接受大小参数
即使你试图传递一个固定大小的数组,结果也是语法上的糖衣炮弹:
http://ideone.com/gaSl6J
还记得我说过数组不是指针,只是等价的吗?
数组大小将是5 * sizeof(int)= 20指针大小将是sizeof(int *),其将是4或8字节。
如果你想知道数组中有多少个元素,当你有数组而不是指针时,你可以写
或sizeof(数组)/ sizeof(* 数组)
zz2j4svz2#
这是使用向量而不是数组的一个很好的理由。但是如果你必须使用数组,那么你必须把数组的大小作为参数传递给你的函数
数组在C++中是相当差的,你越早学会使用向量,你就越容易找到东西。
qlckcl4x3#
指针没有关于它们所引用的元素数量的信息。如果你说的是函数调用的第一个参数,那么如果list是一个数组,你确实可以使用下面的语法
我想补充的是有三种方法。第一种是使用数组通过引用传递。第二种是使用指向第一个元素的指针和元素的数量。第三种是使用两个指针-开始指针和最后指针,因为标准算法通常是定义的。字符数组有一个额外的可能性来处理它们。
64jmpszr4#
答案很简单,你不能。你需要把它存储在一个变量中。C++的最大优势是它有STL,你可以使用vector。size()方法给出了那个时刻向量的大小。
输出:
10个
20
未测试。但应该可以。)
4jb9z9bj5#
你需要记住在一个可变数组大小中,不可能从指针中检索数组大小。
swvgeqrz6#
我的答案使用了一个字符数组而不是整数数组,但我希望它能有所帮助。
您可以使用计数器直到到达数组结尾。字符数组总是以'\0'结尾,您可以使用它来检查是否到达数组结尾。
现在你有了char数组的长度。
我试着用这个方法计算数组中的整数个数。显然,'\0'在这里显然不适用,但是数组的-1索引是0。所以假设在你使用的数组中没有0。你可以在代码中用0替换'\0',并将代码改为使用int指针和数组。