指针是变量还是地址?
因为int** array= new int*[4]
太混乱了。
对于此代码中的int** array
,指针成为存储指针地址的变量,new int*[4]
成为将存储在另一个指针中的地址。
我理解错了什么?
指针是一种数据类型,类似于int
或char
。 此处的数据是内存地址。 指针使用预期位于内存中引用地址的值类型进行限定。 与其他数据类型一样,指针可以用作变量、函数参数、数组元素等的类型。
因此,int **array
是int **
类型的变量,这意味着指向位于内存中某处的int *
类型的值的指针。 反过来,int *
表示指向位于内存中某处的int
类型的值的指针。 或者,简而言之,int **
是指向int
的指针。
表达式new int*[4]
表示在内存中分配一个int *[4]
类型的对象并返回指向它的指针。 类型int *[4]
表示由int *
型的四个元素组成的数组,其中int *
,正如我们已经知道的,表示一个点到int
值。
因此,在初始化中,左部分(int **
)和右部分(int *[]
)的类型是不同的。 但是,如果数组元素的类型与指针引用的值的类型相同,C++能够自动将数组转换为指针。 在我们的例子中,数组元素类型是int *
,指针引用的类型也是如此。 当数组转换为指针时,生成的指针将引用数组的第一个元素。
在此声明中
int** array= new int*[4];
array
是一个变量,由元素类型为int *
的动态分配数组的第一个元素的地址初始化。
如果你有一个声明如下的数组
T array[N];
其中T
是某种类型,则可以声明指向数组第一个元素的指针,例如
T *p = array;
如果考虑到您的数组,那么只需T
等于int *
。
简单地说,指针是一个变量,可以存储另一个变量的地址,而不是一个int
或一个float
或其他一些值,如"普通">变量。
像任何其他变量一样,指针本身也有一个地址,因此你可以有一个指向指针的指针,即存储另一个指针地址的指针。