2013-07-01 164 views
3

我对指向指针的指针有些困惑,并且由于谷歌省略了一些符号而无法找到想要的结果。什么是下面的语句实际上意味着关于指针指针的混淆

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]; 

第一,如果有人清除我的疑惑我们将不胜感激。谢谢!

+4

使用[**顺时针螺旋规则**](http://c-faq.com/decl/spiral.anderson.html) –

+1

'双pointer'是混乱的,人们可能会认为这是一个指向'double'的指针,使用'pointer to pointer'。 –

+0

http://cdn.memegenerator.net/instances/400x/25611683.jpg –

回答

7

什么下面的声明实际上意味着

这意味着指针数组的指针的int。数组中有10个元素,每个元素的类型为int**

什么是下面的语句描绘?

它首先访问数组中的第一个元素,然后取消引用它以访问int*。指向第一个元素的int指针指向指向新分配的内存。新分配的内存保存值为5

而且是第一个语句等效为int *(* ARR)[10];

不,完全没有。 int* (*arr)[10];是指向数组int*的指针。换句话说,它不是一个数组,它是一个指向数组的指针,并且它指向数组包含10个元素;这些都是int*

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)。

3

[]符号的优先级高于*当你做出声明。因此,像

int* arr[10]; 

实际上是10个指针,即使阅读从左至右它自然看起来像一个指针数组整数数组。

但是如果调整优先级,像这样:

int (*arr)[10]; 

你得到一个指向十个整数数组。

在你的情况int** arr[10];是10个指针的数组的指针。它不等同于int* (*arr)[10];,因为后者是一个指向10个整数指针数组的指针(基本上在前一种情况下,您有一个数组,而在后者中是一个指针,这是一个非常重要的区别)。

也许C++专家可能会在你的关于new的问题上发出警告。

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 = &num; 
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]说, “让其他指针,请”
*常用3 [0] = new ...将new返回的地址赋给另一个指针。

2

一个好的技巧破译陈述这样是采取一步一步,并建立

这是double数组

double array[5];

阵列也是一个指针,所以这是该相同(但是第一个大小是已知为五在第二它可能指向任何数目)

double *array;

`

现在让我们尝试一些更普遍

T *a;是指向一个或多个TS所以T a[x];其中x是一个数字

这里建立T **a;是指向一个或多个指针指向一个或多个TS

这意味着*a是指向一个或多个Ts和类似

*a = new T[5]是有效的但a = new T[5]不是一个正确的人会a= new T*[5]创建5个指针TS

所以回到你原来的例子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 
+0

'数组也是一个指针,所以这是相同的'不,数组和指针是完全不同的。 '这里a是指向一个或多个指针的指针'不,它是指向指针的指针。它不是一个数组,它指向一个指针。 –

+0

@JesseGood所以你不能做int * a = new int [x]?或者int ** a = new int * [x]?我明白你的意思,我可以分配一个指向数组中第一个单元格的地址的指针,并尝试在答案中清除它 –