关于指向指针的指针的混淆
Confusion regarding pointers to pointers
我对指向指针的指针有点困惑,并且由于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];
如果有人消除我的疑虑,将不胜感激。谢谢!
下面的陈述到底是什么意思
它表示指向int
的指针到指针的数组。数组中正好有 10 个元素,每个元素都有一个 int**
的类型。
它以下陈述描述了什么?
首先访问数组中的第一个元素,然后取消引用它以访问int*
。第一个元素指向的 int 指针被分配为指向新分配的内存。新分配的内存的值为 5
。
并且是第一个语句等价于 int* (*arr([10];
不,一点也不。 int* (*arr)[10];
是指向 int*
数组的指针。换句话说,它不是一个数组,它是一个指向数组的指针,它指向的数组包含 10 个元素,这些元素都是int*
的。
进行声明时,[]
表示法优先于*
。所以像
int* arr[10];
实际上是一个包含 10 个指向整数的指针的数组,即使从左到右读取它自然看起来像指向数组的指针。
但是,如果您像这样调整优先级:
int (*arr)[10];
你会得到一个指向十个整数数组的指针。
在您的情况下int** arr[10];
是一个包含 10 个指向指针的指针的数组。它不等同于int* (*arr)[10];
因为后者是指向 10 个整数指针数组的指针(基本上在前一种情况下,您有一个数组,而在后一种情况下,您有一个指针,这是一个非常重要的区别(。
也许C++专家可以回答您关于new
的问题。
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 返回的地址分配给另一个指针。
好的,让我们一次回答一个问题。
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 指针数组的指针(源(。
破译这样的语句的一个好技巧是一步一步地进行并建立
这是一个双打数组
double array[5];
数组也是一个指针,所以这是相同的(但是第一个的大小已知是五,第二个它可以指向任何数字(
double *array;
'
现在让我们尝试一些更一般的东西
T *a;
是指向一个或多个 T 的指针,因此T a[x];
其中 x 是一个数字
在这里建立T **a;
a 是指向一个或多个指向一个或多个 T 的指针的指针
这意味着*a
是指向一个或多个 T 的指针,
*a = new T[5]
是有效的a = new T[5]
但是a= new T*[5]
不正确的,它会创建 5 个指向 T 的指针
所以回到你的原始例子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
- c++r值引用应用于函数指针
- 什么相当于 Kotlin 上的C++指针?
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- 互斥锁能否保护相对于特定指针的数据?
- C++ C 的双指针相当于什么?
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 指针算法是否适用于迭代器?
- 如何破坏包含自指指针的对象
- C++ ->尝试逐字阅读一行文本。如何使指针等效于用于存储输入的当前二维数组
- 将运算符重写应用于具有动态分配指针的类
- 动态强制转换适用于模板成员函数内的共享指针和弱指针,无需代码重复
- 如果我将 decltype 应用于产生右值的表达式,我是否总是得到一个指针?C++
- 难道不应该有一个类似于"this"的与名称无关的类指针供成员函数在C++中引用吗?
- 指您不拥有的"std::unique_ptr"(使用原始指针?
- 为什么"return 0"适用于在函数中返回指针,但不适用于参考?
- STL 算法 + c'tor 不再适用于指向 C 数组的原始指针,因为指向一个过去的末端
- 指向成员的指针的语法糖适用于数组,但不适用于 std::vector
- C#等效于C 中的const指针
- 创建独立于构造函数的对象指针
- 为什么数组的类型推断会将指向第一个的指针优先于对数组的引用