gpt4 book ai didi

c++ - 用另一个数组初始化指向数组的指针的点

转载 作者:行者123 更新时间:2023-12-01 14:39:16 29 4
gpt4 key购买 nike

指向数组的指针用另一个数组初始化。它试图完成什么?

float range_[] = {0, 180};
const float* range[] = {range_};

我试图将它们合并到一个类中,而C++对于将可变长度数组放入类中很挑剔,所以我需要等效的东西,但请问它在做什么

最佳答案

怎么样呢?让我们只说一个关于演示代码的内容。就演示代码而言,这非常具有启发性。它切入作者的障碍,强大到足以释放出大量的文字,这将使水坝的失败感觉像国际空间站的运行人员所观察到的一样可怕。数百英里的真空度无疑给出了一个视角。

但是我们不应该对此刻薄。好吧,我不能。有人编写了该演示代码,但碰巧的是我(谁知道我写了什么演示代码,我已经不记得了)-不会对自己卑鄙。因此,我们将放轻松。
range是一个指针数组。但是您不应该使用任何一种,很有可能。

您的可变长度数组的名称为std::vector。只是使用那个。效果很好。

但是回到指针等:指针数组就像一个非常精简的通讯录。每个指针都是某人的地址或某物的地址。当您只有通讯录时,就没有 friend 了。您只需要他们的地址。您可能还碰巧拥有了这些 friend 的家,然后地址簿列出了您所拥有的东西。但这需要土地购买。或者,用编程语言来说:内存分配和所有权。

因此,要拥有地址,首先需要有人购买土地。必须分配一些内存,然后您可以将地址放入通讯簿中。第一个页面为零(索引为零),第二个页面为第一,依此类推。

至于代码要完成的工作:有些愚蠢的事情,也许是吗?

float range_[] = {0, 100};

第一行很明显:这是一块土地。两英亩。在一个英亩土地上有一个大的零雕塑-一个更接近您的土地。一英亩的雕塑是100英亩。并没有全部写出来-编译器“填补了空白”。第一行的实际含义是:
float range_[2] = {0, 100};

现在到第二行:
const float* range[] = {range_};

您可能知道现在的方向:让我们填补空白:
const float* range[1] = {range_};

第二行是该通讯录。它还占用一些空间:毕竟,即使是通讯录也无法容纳零英亩的土地。什么都不会。因此,您仅需要一点空间来存储地址簿,但是它可能比保存地址的东西小得多。即使面积相对较小(就事情而言, float也不是很宽敞)。地址簿中恰好有一个地址的空间,该地址是两英亩地块,上面有两个数字雕塑。但是请稍等:通讯录中的地址说不到两英亩。它只是说这是一些英亩的地址。它甚至可能是一英亩的地址。这样的地址由 nullptr表示。

通讯录中还包含一个注释,禁止您将其弄乱。用C语言来说,它是指向常量值的指针。或一堆常数值。还是没有。看看指针在哪里?真的很难知道您在做什么。好吧,也许是某人的地址。它可能没有地址,也可能是挤满整个学校实地考察之旅的学生的旅馆的地址,也可能是空荡荡的电话亭的地址。你不相信我吗?这里:
double phoneBooth = std::nan("empty");
double *i_hope_my_friends_are_there = &phoneBooth;

这是真正的C++。它编译。这几乎等于我所说的。如果您需要指定一个空的电话亭,而您所得到的只是一个双,那么您就可以做到这一点。您可能希望将其放在一些演示代码中,以增加效果。因此,现在您了解了为什么指针会很糟糕。并加倍。双打当然很糟糕,但花车甚至更糟糕。哦-除非您是大型机程序员。然后,这应该是完全熟悉的:
float pbth = nan("MPT");

也是真正的C++代码,除了有人将 using namespace std放在更早的地方。那简直就是罗word,足以让任何种植COBOL的人都能接受。 pbth的定义与COBOL背景形成鲜明对比。它具有System 360组装的功能。

但是,我们分心了。回到 range_!没有人谈论拥有 range_属性的人将如何处理它。他们可能会炸毁整个地方。您所知道的是,禁止 对该属性进行任何更改-如果您只有该地址簿。所以-也许您确实知道您确实还拥有那块土地,然后您可能是那块土地的继承人。但是很难判断您是否只有该地址簿。它只是说:
  • 您可以看一下雕塑,而且-顺便说一句,展览在一天当中的随机时间进行更改,但前提是您必须不断购买西红柿。 (我保证,它将使合理性提高1%)

  • 现在再说一秒钟:为什么给定一个通讯录,您会想到两个维度,而仅仅因为您所获得的地址本身就具有一个维度?您根本不需要这样思考。至少没有任何人会自然而然地想到(数学家除外)。如果您建模的问题实际上具有两个维度(空间维度, vector 空间维度之类的东西),则只想以这种方式思考。否则,就没有太多“2D”了。您几乎不会认为矩阵是“二维”对象。

    如果您有一个写有您 friend 地址的实际地址簿,并且四处谈论您的地址簿是4D,因为它是大概3D空间中的邮政地址的“一维”列表,那么人们可能会对整个事情看起来很有趣。这不是一个很实际的看法。异常(exception):只有它可以帮助您解决问题,这才是实用的。但这不应该被认为对您有所帮助,只是因为其他人似乎对此有所帮助。希望最后揭露本段训诫中的讽刺意味。

    实际上,实际上,如果您得到的矩形区域具有不连续的面积单位(“正方形”),您会认为它具有二维尺寸,但是最紧凑的存储方式通常不是将其切成小块,然后扔掉他们在风中四处张望,看看他们掉落在附近的什么地方,并收集他们住的地方。不幸的是,那是学生以及常常是不幸的教授们期望使用的一系列指针的方式。取而代之的是,只保留一个足够大的长块,并保留其地址。甚至更好的方法是将其围起来,种植一些西红柿,然后按照您想要的顺序收集它们,让这些方法处理细节。

    现在您的需求可能比这更奇特,但是只要矩形区域“很小”,比如说不超过浮点数的一百个项目,将其全部成一个块并将元素四处移动可能是最快的方法处理它。我的意思是:如果您关心的是实际性能,而不是某些数学家的想法,即计算机在执行此类任务后应该如何表现阴影。很少有被广泛使用的实用计算机能够达到这种理念。

    就复杂性理论而言,基于AVR的Arduino有一些定义明确的阴影,您可能会发现链接列表的行为有点像算法类(class)中讲授的那样。但是,在您的PC上运行相同的程序,对其进行一些调整,您可能会遇到比在Arduino上性能更差的情况。我不骗你-肯定会是一个病态的案例,但编造并非难事。词汇量比我高的人称其为“拒绝服务”,但我不确定向人们扔西红柿在多大程度上拒绝他们进餐,而不是说给他们喂西红柿。

    然后您重写上述程序,使其行为在Arduino上慢10倍,而在PC上快数千倍。我绝对不是在这里开 Jest 。

    从您的问题回到那本破烂不堪的通讯录:它不是非常有用,因为它只有一页,可以大声喊叫。而且没有办法改变它。单页装订即可。需要存储更多地址吗?去拿另一个。您也可以只存储一个地址,而不存储地址簿的全部细节。一张纸-无需装订工作。它可以是单个地址,而不是具有单个元素的数组。像这样:
    const float *range = range_;

    但是,当然,您正在编写C++。所有这一切都是愚蠢的。如果您需要的只是一块可以轻松调整大小的土地,请使用 vector :
    struct MyClass {
    std::vector<float> range;
    };

    它在一个结构中,而不是一个类中,只是因为它告诉了人类某些东西-对编译器而言,两者实际上是同一回事。它告诉人类的是:这是属性(property)。没有监督。您完全打开了它,可以做您想要的。有挖掘机,想挖个地方吗?快走吧除非它是一个const结构-否则它是被禁止的。当然。但不总是。如果对象本身是const,则被禁止。但是,如果该对象不是const,但您有一个指向它的标有“指向const的指针”的指针,那么您将拥有后门。 const_cast,启动挖掘机,继续。没关系。不是UB。

    通常,我们将关键字 class保留给以某种方式管理属性的用途。土地将在篱笆后面,而站在篱笆上的一群人会向您出售在土地上生长的西红柿。如果您将它们称为“方法”,他们可能会被冒犯,但是在软件工程界,这种说法是司空见惯的。降解软件工程的东西。

    但是假设您确实想要 vector 的 vector :
    using A_vector_of_vectors = std::vector<std::vector<float>>;

    您拥有城市街区,每个街区上都有许多属性。与城市街区一样,这仅在街区稍微分离,不交织,又有些独立的情况下才有意义:它们确实以自己的速度增长(或不增长),并且其大小要求各不相同。如果您希望始终访问在一起的街区,并且对其大小有一定的规律性模式(全部相等,或者以算术或几何级数进行缩放-这样的话),则可能只需要一个大城市街区-仅细分了细分区域在某种 map 上,而不是通过道路工程和绕道而定。

    您可以拥有零个或多个城市街区:这是外部 vector 。每个城市街区可以具有任意大小-甚至可以为零。当它的大小为零(为空)时,您所得到的只是一个“名称”,用它来称呼它,以便以后可以说“嘿,我们希望Nomish Quarters的大小适合四个nomes!” ”。那个特定的内部 vector 将增长到4号。

    我们可以用简单的符号表示这些 vector 和子 vector 的特定内容。假设有三个 vector ,第一个 vector 不带任何元素,第二个 vector 不带一个元素,第三个 vector 不带两个元素。您可以像这样将其写下: {{}, {50}, {80, 90}}。很简单。现在我们可以使用它来预填充 vector 的 vector :
    struct MyClass {
    A_vector_of_vectors vov{{}, {50}, {80, 90}};
    };

    这是制作 MyClass的秘诀:目前,这只是一个柏拉图式的想法。有点像纯素食肉饼的食谱,上面装饰着完美的照片。当您第一次制作鞋底时,它们很适合成为鞋底。随后,它们往往变得很棒。是的,该类不存在,只是一个影子。如果您想吃个东西,就必须创建一个实例:
    MyClass anInstance;

    现在我们有了一个小城市,有一组三个城市街区,第一个为0英亩,第二个为1英亩,第三个为2英亩。他们很包容。您可以调整其中每个的大小。您可以重新排列其顺序或其中的英亩顺序。您可以添加新的。删除旧的。最好的是什么?您需要其他人来完成所有工作。 std::vector和编译器负责细节。当您不再需要 anInstance时,只需对其进行核对即可。您结束范围,因此结束城市。就这样
    int main() {
    MyClass anInstance;
    } // bye bye, city

    看吧,没有 malloc,没有 free。番茄人为我们做了一切!

    关于c++ - 用另一个数组初始化指向数组的指针的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62274494/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com