我是C ++的新手。刚刚开始吧。我遇到的问题是一次又一次地说无法将int**
转换为int*
。
我知道在编译器中,数组的解释与指针相同,所以如果我要编写a[]
,那么它将被解释为a*
如果我写a[]
a
的数据类型为int*
,那么它将被解释为int**
?
答案 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::array
和std::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];
所以当上述条件之一适用时,数组可以表示为指针。