int ** = int * []对于数组是否正确?

时间:2015-11-10 16:48:37

标签: c++ arrays pointers

我是C ++的新手。刚刚开始吧。我遇到的问题是一次又一次地说无法将int**转换为int*

我知道在编译器中,数组的解释与指针相同,所以如果我要编写a[],那么它将被解释为a* 如果我写a[] a的数据类型为int*,那么它将被解释为int**

2 个答案:

答案 0 :(得分:2)

  

我遇到的问题一再说不能转换int**   到int*

这是一个问题,可以归结为取消引用的int**int*)不是解除引用的int*int)。

指针和int可能完全不同,具体取决于您的编译器和计算机。它们甚至不需要具有相同的尺寸。

这究竟是一个“问题”,究竟是什么?

  

我知道在编译器中,数组的解释与指针相同,

这是非常简化语句。数组可以解释为指向其第一个元素的指针。发生这种情况的一种常见情况是,当人们尝试按值将数组传递给语言不允许的函数时。

以下功能确实相同:

void f(int a[])
{
    int first_element = a[0];
    int first_element_too = *a;
}

void f(int* a) // identical
{
    int first_element = a[0];
    int first_element_too = *a;
}

(如果您尝试这样做,您的链接器甚至会抱怨重新定义。)

  

所以,如果我要写a[],那么它将被解释为a*

我认为你的意思是,如果你写int a[],那就好像你写了int* a一样?

在某些情况下。

  

如果我写a[] a的数据类型为int*

那是不可能的。如果您编写a[],那么它就是声明的一部分,因此a不是int*类型,而是数组类型。

我认为你真正的意思是int*元素数组,即int* a[]

  

那么它会被解释为int**

在某些情况下。同样,典型的情况是尝试按值传递数组:

void f(int* a[])
{
    int* first_element = a[0];
    int* first_element_too = *a;
}

void f(int** a) // identical
{
    int* first_element = a[0];
    int* first_element_too = *a;
}

请注意这两个函数如何 尝试将int**转换为int*int*第一个元素

顺便说一下,虽然研究这些C ++的低级基础知识肯定不会有害,但你应该在实际代码中使用std::arraystd::vector

答案 1 :(得分:0)

Array是一个连续的字节存储器 指针是几个字节,它保存其他变量的内存地址。

数组!=指针。

虽然它们不相同,但它们共享一些链接:

  • 数组的名称变成指向第一个元素的指针

所以这适用:

int arr[3];
arr == &arr[0]; //true
  • 当数组作为函数参数发送时,它衰减成指针,所以签名

void f (int arr[4])

相同

void f(int* arr)

  • 指针用于捕获动态分配的数组:

int* arr = new int[4];

所以当上述条件之一适用时,数组可以表示为指针。