我对指针的指针感到有点困惑,由于Google省略了一些符号,因此无法找到所需的结果。以下陈述实际上意味着什么
int** arr[10];
它是一个包含10个双指针的数组,还是指向10个整数指针数组的指针(或两个语句都相同)。
以下声明描述了什么?
*arr[0] = new int(5); //assign the first pointer to array of 10 pointers a memory of 5?
是第一个等同于
的陈述int* (*arr)[10];
如果有人清除了我的疑虑,我们将不胜感激。谢谢!
答案 0 :(得分:7)
以下陈述实际上意味着什么
它表示指向int
指针的指针数组。数组中只有10个元素,每个元素的类型为int**
。
以下声明描述了什么?
它首先访问数组中的第一个元素,然后取消引用它以访问int*
。第一个元素指向的int指针被指定为指向新分配的内存。新分配的内存的值为5
。
并且是第一个等同于int *(* arr)[10];
的语句
不,一点也不。 int* (*arr)[10];
是指向int*
数组的指针。换句话说,它不是一个数组,它是一个指向数组的指针,它指向的数组包含10个元素,它们都是int*
。
答案 1 :(得分:3)
当您进行声明时,[]
表示法优先于*
。像
int* arr[10];
实际上是一个包含10个整数指针的数组,即使从左到右读取它自然看起来像是指向数组的指针。
但是如果你像这样调整优先级:
int (*arr)[10];
你得到一个指向十个整数数组的指针。
在你的情况下,int** arr[10];
是一个包含10个指针指针的数组。并且它不等同于int* (*arr)[10];
,因为后者是指向10个整数指针的数组的指针(在前一种情况下,你有一个数组,而在后一种情况下,指针是一个非常重要的区别)。
也许C ++专家可能会对你关于new
的问题提出疑问。
答案 2 :(得分:3)
35 <---- I am a pointer to an int
35 <---- I am pointer to an int <---- I am a pointer to an int pointer
此代码:
int** arr[10];
在最右边的那里声明了一个包含10个指针的数组。
int** arr[10];
int num = 35;
int* pint = #
int** ppint = &pint;
arr[0] = ppint;
int** ppint2 = new int*[5];
int num2 = 35;
int num3 = 45;
*ppint2 = &num2;
*(ppint2 + 1) = &num3;
cout << **ppint2 << " " << **(ppint2 + 1) << endl;
--output:--
35 45
int* pint2 = new int[3];
int* pint3 = new int[2];
*pint2 = 10;
*(pint2 + 1) = 20;
*(pint2 + 2) = 30;
*pint3 = 100;
*(pint3 + 1) = 200;
arr[0] = &pint2;
arr[1] = &pint3;
cout << **arr[0] << endl;
cout << *(*arr[0] + 1) << endl;
--output:--
10
20
pointer
是存储内存地址的变量。因此,假设您将int 10存储在地址1A中。您可以将指针变量创建为10,指针变量的值将为1A。当然,指针的值必须存储在某处的内存中,因此您可以创建另一个指针来存储第一个指针值在内存中的位置。您可以通过将第一个指针的地址分配给第二个指针来实现。第一个指针的类型是int *,第二个指针的类型是int **,即第二个指针是存储int指针地址的指针。
*arr[0] = new int(5);
arr [0]是一个指针,用于存储其他指针所在的地址
* arr [0]说,“请另取指针”
* arr [0] = new ...将new返回的地址分配给另一个指针。
答案 3 :(得分:2)
好的,让我们一次提出这个问题。
int** arr[10];
是一个由10个指针组成的数组,指向整数指针。通常可以从右到左更容易地阅读C ++中的声明。请注意arr
是一个数组,不是一个指针 - 尽管它可以“衰减”成指向其元素的指针(其类型为int***
)。
*arr[0] = new int(5);
涉及几个步骤。首先,在堆上分配一个整数(这就是new
所做的)。它用值5初始化((5)
位调用int
的“构造函数”)。 new
将指针(int*
)返回到内存中新分配的int的位置。该指针被分配给arr中第一个指向指针所指向的指针 - *
取消引用赋值的第一个元素。
int* (*arr)[10];
有点异国情调,并不等同;它似乎声明了一个指向10个int指针数组的指针(source)。
答案 4 :(得分:2)
解读这样的陈述的一个好方法就是一步一步地建立起来
这是一个双打数组
double array[5];
数组也是一个指针,所以这是相同的(但是第一个,大小在第二个,它可以指向任何数字)
double *array;
`
现在让我们尝试一些更通用的东西
T *a;
是指向一个或多个Ts的指针,因此T a[x];
其中x是数字
在这里构建T **a;
a是指向一个或多个指向一个或多个Ts
这意味着*a
是指向一个或多个Ts的指针,类似
*a = new T[5]
有效但是a = new T[5]
不正确a= new T*[5]
会创建指向Ts的5个指针
回到原始示例int ** arr[10];
这里arr指向一个10 int **的静态数组,这意味着arr[0] = new int*[5]
是一个有效的语句,以下是有效的C ++
int ** arr[10];
arr[0] = new int*[5];
arr[0][1] = new int[5];
arr[0][1][0] = 4;
std::cout << arr[0][1][0] << std::endl; // prints 4
delete [] arr[0][1];
delete [] arr[0];
//note that arr doesn't need to be deleted as it wasn't dynamically allocated