从指针c++获取数组大小

von4xj4u  于 2022-11-27  发布在  其他
关注(0)|答案(6)|浏览(280)

我正在写一个简单的函数,它返回数组中最大的整数。我遇到的问题是求出数组中元素的个数。
函数标题如下:

int largest(int *list, int highest_index)

我怎么才能得到数组'list'中的整数个数。
我试过以下方法:

int i = sizeof list/sizeof(int); //returns incorrect value
int i = list.size(); // does not compile

任何帮助将不胜感激!

qyuhtwio

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返回所提供的类型的大小,如果您提供一个对象,则它推导该类型并返回该类型的大小 *

如果你想知道数组中有多少个元素,当你有数组而不是指针时,你可以写

sizeof(array) / sizeof(array[0])

或sizeof(数组)/ sizeof(* 数组)

zz2j4svz

zz2j4svz2#

这是使用向量而不是数组的一个很好的理由。但是如果你必须使用数组,那么你必须把数组的大小作为参数传递给你的函数

int largest(int *list, int list_size, int highest_index)

数组在C++中是相当差的,你越早学会使用向量,你就越容易找到东西。

qlckcl4x

qlckcl4x3#

指针没有关于它们所引用的元素数量的信息。如果你说的是函数调用的第一个参数,那么如果list是一个数组,你确实可以使用下面的语法

sizeof( list ) / sizeof( int )

我想补充的是有三种方法。第一种是使用数组通过引用传递。第二种是使用指向第一个元素的指针和元素的数量。第三种是使用两个指针-开始指针和最后指针,因为标准算法通常是定义的。字符数组有一个额外的可能性来处理它们。

64jmpszr

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
未测试。但应该可以。)

4jb9z9bj

4jb9z9bj5#

你需要记住在一个可变数组大小中,不可能从指针中检索数组大小。

const int SIZE = 10;
int list[SIZE];
// or
int* list = new int[SIZE];  // do not forget to delete[]
swvgeqrz

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指针和数组。

相关问题