为什么是C++;你有数组类型吗? 我正在学习C++。我发现指针与数组具有相同的功能,如a[4],a既可以是指针也可以是数组。但是,由于C++定义,对于不同的数组长度,它是不同的类型。事实上,当我们将数组传递给函数时,它会自动转换为指针,我认为这是数组可以被指针替代的另一个证明。所以,我的问题是: 运算符获得。C++必须与之向后兼容。C++数组有很多错误,但是大小是类型的一部分不是错误的事情。

为什么是C++;你有数组类型吗? 我正在学习C++。我发现指针与数组具有相同的功能,如a[4],a既可以是指针也可以是数组。但是,由于C++定义,对于不同的数组长度,它是不同的类型。事实上,当我们将数组传递给函数时,它会自动转换为指针,我认为这是数组可以被指针替代的另一个证明。所以,我的问题是: 运算符获得。C++必须与之向后兼容。C++数组有很多错误,但是大小是类型的一部分不是错误的事情。,c++,c,arrays,pointers,C++,C,Arrays,Pointers,在早期C中,决定将数组的大小表示为其类型的一部分,通过 sieOfs< /Cuth>运算符获得。C++必须与之向后兼容。C++数组有很多错误,但是大小是类型的一部分不是错误的事情。 关于 “指针与数组具有相同的功能,如a[4],a既可以是指针也可以是数组 不,这只是一个隐式转换,从数组表达式到指向该数组第一项的指针 sizeof(T),并且您形成了一个TD数组,然后,您可以将该数组传递给一个指向T的形式参数,因为TD数组衰减为指向TD的指针,该指针隐式转换为指向T。现在使用指向T的指针作为数组

在早期C中,决定将数组的大小表示为其类型的一部分,通过<代码> sieOfs< /Cuth>运算符获得。C++必须与之向后兼容。C++数组有很多错误,但是大小是类型的一部分不是错误的事情。
关于

指针与数组具有相同的功能,如
a[4]
a
既可以是指针也可以是数组

不,这只是一个隐式转换,从数组表达式到指向该数组第一项的指针

<听起来很奇怪,C++没有提供内置数组的索引。这里有指针的索引,
p[i]
根据定义就是
*(p+i)
,所以你也可以把它写成
*(i+p)
,也可以写成
i[p]
。因此也就是
i[a]
,因为它实际上是索引的指针。真奇怪

隐式转换,称为“衰变”,丢失信息,是C++数组错误的一个。

指针的索引是第二件错误的事情(即使它在汇编语言和机器代码级别上很有意义)

但为了向后兼容,它需要继续保持这种方式


为什么阵列衰变是坏的™: 这使得
T
的数组通常只由指向
T
的指针表示

从这样的指针(例如,作为形式参数)看不出它是指向单个
t
对象还是指向
t
数组的第一项


但更糟糕的是,如果
T
有一个派生类
TD
,其中
sizeof(TD)>sizeof(T)
,并且您形成了一个
TD
数组,然后,您可以将该数组传递给一个指向
T
的形式参数,因为
TD
数组衰减为指向
TD
的指针,该指针隐式转换为指向
T
。现在使用指向
T
的指针作为数组会产生错误的地址计算,这是由于数组项的大小假设不正确。如果你运气好的话,可能只是错误的结果(如果你运气不好的话)。

如果不使用malloc/free或new/delete来创建和销毁堆上的内存,就不能使用指针代替数组声明。您可以将数组声明为变量,然后在堆栈上创建它,您不必担心它会被破坏。

好的,数组是处理数据和操作数据的一种更简单的方法。然而,为了使用指针,您需要有一个清晰的内存地址来指向。此外,在将它们传递给函数时,这两个概念彼此没有区别。指针和数组都是通过引用传递的。希望这能有所帮助

我不确定是否能回答您的问题,但假设您对编码不熟悉:

当您声明一个数组int a[4]时,您会让编译器知道您需要4*int内存,而编译器所做的是为该4*int大小内存的“开始”地址分配一个。当你以后使用[x]时,[x]表示做(a+sizeof(int)*x)并取消引用该指针地址以获得int


换句话说,它始终是一个指针,而不是一个“数组”,它只是一个抽象,使您更容易编写代码int[4]数组的大小是
int[2]
数组的两倍,因此它们不能属于同一类型

但是你可能会问,“为什么类型意味着大小?”

  • 局部变量需要占用一定的内存。当您声明一个数组时,它会占用与其长度成比例的内存。当你声明一个指针时,它总是你机器上指针的大小
  • 指针算法由它指向的类型的大小决定:由
    p
    指向的地址和由
    p+1
    指向的地址之间的距离正好是它的类型的大小。如果类型没有固定的大小,那么
    p
    将需要携带额外的信息,否则C将不得不放弃算术
  • 一个函数需要知道它的参数有多大,因为函数被编译为期望它们的变量在特定的位置,并且有一个未知大小的参数会把这搞砸

    你会说,“如果我把一个数组传递给一个函数,它就会变成一个指针。”没错,但是你可以创建新的类型,将数组作为成员,然后你可以传递这些类型。在C++中,实际上可以将数组作为数组传递。
    int sum10(int (&arr)[10]){ //only takes int arrays of size 10
        int result = 0;
        for(int i=0; i<10; i++)
            result += arr[i];
        return result
    }
    
    intsum10(int(&arr)[10]){//只接受大小为10的int数组
    int结果=0;
    
    对于(int i=0;我不确定实际原因,但其中一个原因是指针通常指向单个元素,而数组指向数组。这使人更容易阅读。尝试使用没有数组类型的多维数组。“我认为这是指针可以替代数组的另一个证明”:这不是一个逻辑推理。有一个信息丢失,特别是信息的大小。可能是因为数组在许多语言中都是通用的数据结构,例如FORTRAN和BASIC,它们早于C。指针比数组更难理解。我有理由我们不能同时拥有这两个?是重复投票,sinCE问OP为什么C++不能用指针替换所有数组,数组不是指针的事实是undes。