我想知道当你声明以下内容时,内存中会发生什么:
int **array;
我想知道当你声明以下内容时,内存中会发生什么:
int **array;
arr[i][j]
,并且
**arr
指向 arr[0][0]
*((*arr)+1)
指向 arr[0][1]
*(*(arr+1)+1)
指向 arr[1][1]
C++ 示例代码#include <iostream>
using namespace std;
int main()
{
int **arr;
arr = new int*[5];
for(int i = 0; i < 5; i++)
arr[i] = new int[5];
arr[0][1] = 1;
cout << *((*arr)+1); // prints 1
cout << arr[0][1] = 1; // prints 1
}
编译器会预留四个字节的空间(在32位系统上,64位系统上则是八个字节)来存储一个指针(该指针指向另一个指针,后者指向int)。编译器不会进行进一步的内存分配,实际上将指针设置为指向存放int*/数组等的其他内存位置还需要由程序员来完成。
你声明了一个指针变量,所以你为一个内存地址分配了足够的空间(取决于你的平台/编译器等)。
类型系统将确保你只分配包含其他内存地址的地址,并且这些地址表示整数变量的实际地址。
要使用指向指针的指针,你需要解除引用一次(获取实际指向整数的地址),然后再解除引用一次(获取实际整数)。
你可以通过显式转换成其他类型(例如 i=&pDouble)来绕过类型系统,但除非你确定自己知道在做什么,否则不建议这样做。
如果你有一个二维数组,你可以将其概念化为表示行的单个一维数组的一系列单个一维数组。第一级间接引用将用于选择行,另一级间接引用将用于选择行中的单元格。
这是一个指向int指针的指针。通常用于声明二维数组,每个int指针都是一个数组,而双重指针是一个数组的数组。