指向数组中指针的指针
Pointers to pointers in arrays
我有一个关于C++中的指针和数组的问题。我不确定这部分代码到底在做什么。在我看来,iarray 被声明为普通数组。但是,q被访问就像一个2d数组一样。
int iarray[10];
int *p = iarray;
int **q = &p;
q[0][2] = 25;
如果我将 iarray 更改为:
int iarray[10]{3,2};
int *p = iarray;
int **q = &p;
q[0][2] = 25;
cout << q[0][0] << endl;
cout << q[1][0] << endl;
第一个将打印 3,我在上面声明时理解。但是第二个是空白的,我不明白为什么。
让我们一次看一条指令:
int iarray[10];
将在内存中保留 10 个整数大小的字节。如果sizeof(int) == 4
,它将保留 40 个字节。假设内存范围设置在 0x10 - 0x37 之间。
int *p = iarray
保留 4 个字节(如果我们假设我们在 32 位处理器上运行),并将起始地址存储到上一条指令中保留的 40 个字节。p
是我们用来指代这 4 个字节的简写。假设这 4 个字节存储在 0x50 - 0x53。
int **q = &p
保留 4 个字节,用于保存 p (0x50) 的起始地址。 Q 可以存储在 0x60-0x63 处。
指针上的 c++ 中的数组索引运算符是指针算术的简写。例如,q[N]
与*(q + N)
是一回事,因此,在我的示例中,q[0]
将为您提供在地址 0x60-0x63 处持有的值,即0x50。 如果再次使用 index 运算符,它将应用于新地址 (0x50),因此q[0][2]
等效于p[2]
,即iarray[2]
。
q[1]
相当于*(q + 1) = *(0x60 + 0x4) =*(0x64)
。如果你看上面,我们从不保留地址0x64,所以我们从我们不拥有的内存中读取 - 未定义的行为。
让我们来看看这个:
int iarray[10]; // declare a array of 10 ints
int *p = iarray; // p is used like an alias for iarray, an int[] is also an int*
int **q = &p; //q is a pointer to pointer p
q
仅指向单个值。您可以将q
想象成一个只有一个条目的数组。您也可以将其写为int *q[] = { &p };
因此q[1][0]
是未定义的行为,因为q[1]
已经超出了界限。
- 指向指向字符数组的指针数组的指针
- 通过指向指针数组的指针访问子类的属性
- C++,指针数组,指向双链表中的条目
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- C++从函数指针数组调用函数
- 关于指向指针数组的指针
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 将链表转换为指针数组时出错
- C++ 对象指针数组的复制构造函数
- C++ - 循环访问指针数组会导致错误
- 删除指针数组 (C++) 中的元素
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将函数指针数组中的函数指针作为模板参数传递
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 具有推导参数的模板函数指针数组变量
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++指针数组到字符数组中的特定位置
- 如何在C++中复制指针数组的数据
- 初始化类中的指针数组,并在另一个类中检索它
- 尽管直接设置了指针数组,但仍为空