c java服务返回数组为空_为什么C ++不支持函数返回数组?

简而言之,我猜这只是一个设计决定。更具体地说,如果您真的想知道为什么,则需要从头开始。

让我们首先考虑C。在C语言中,“按引用传递”和“按值传递”之间有明显的区别。简单地说,C语言中的数组名称实际上只是一个指针。对于所有意图和目的,差异(通常)归结为分配。编码

int array[n];

会在堆栈上创建4 * n字节的内存(在32位系统上),并且与声明该代码块的范围相关。反过来,

int* array = (int*) malloc(sizeof(int)*n);

将创建相同数量的内存,但是在堆上。在这种情况下,该内存中的内容与范围无关,只有对内存的引用受该范围的限制。这就是按值传递和按引用传递的地方。如您所知,按值传递意味着将某些内容传递给函数或从函数返回时,传递的“事物”是评估变量的结果。换一种说法,

int n = 4;

printf("%d", n);

将打印数字4,因为该构造 n计算结果为4(对不起,如果这是基本的,我只想涵盖所有基础)。这4与程序的存储空间完全没有关系或关联,它只是一个文字,因此一旦离开该4具有上下文的范围,就会丢失它。引用传递怎么样?在函数的上下文中,通过引用传递没有什么不同。您只需评估通过的构造。唯一的区别是,在评估传递的“事物”之后,将评估结果用作内存地址。我曾经有一个特别的愤世嫉俗的CS讲师,他喜欢说没有通过引用传递的东西,只是传递聪明价值的一种方式。真的,他是对的。因此,现在我们根据功能来考虑范围。假设您可以拥有一个数组返回类型:

int[] foo(args){

result[n];

// Some code

return result;

}

这里的问题是结果计算结果为数组第0个元素的地址。但是,当您尝试从此函数外部(通过返回值)访问此内存时,会遇到问题,因为您试图访问不在您正在使用的范围内的内存(函数调用的堆栈)。因此,解决此问题的方法是使用标准的“通过引用传递” jiggery-pokery:

int* foo(args){

int* result = (int*) malloc(sizeof(int)*n));

// Some code

return result;

}

我们仍然获得指向数组第0个元素的内存地址,但是现在我们可以访问该内存了。

我有什么意思 在Java中,通常断言“一切都是通过值传递的”。这是真的。上面的同一位愤世嫉俗的讲师对Java和OOP也有这样的概括:一切都只是一个指针。而且他也是对的。尽管Java中的所有内容实际上都是按值传递的,但几乎所有这些值实际上都是内存地址。因此,在Java中,该语言的确允许您返回数组或字符串,但可以通过将其转换为带有指针的版本来实现。它还为您管理您的记忆。自动内存管理虽然有用,但效率不高。

这将我们带入C ++。发明C ++的全部原因是因为Bjarne Stroustrup在其博士期间一直在对Simula(基本上是原始的OOPL)进行实验,并认为从概念上讲它是出色的,但是他注意到它的表现非常糟糕。因此,他开始研究名为C的Classes,并将其重命名为C ++。为此,他的目标是制作一种编程语言,该语言可以利用Simula的某些最佳功能,但仍保持功能强大且快速。他之所以选择扩展C是因为它已经具有传奇般的性能,而一个折衷是他选择不像其他OOPL那样大规模实施自动内存管理或垃圾收集。从模板类之一返回数组是可行的,因为您正在使用一个类。但是,如果您想返回一个C数组,您必须使用C方式进行操作。换句话说,C ++确实支持与Java完全相同的方式返回数组。它只是不能为您完成所有工作。因为丹麦哥们认为这太慢了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值