(int **array;)创建了一个指向指针的指针数组。

5

我想知道当你声明以下内容时,内存中会发生什么:

int **array;

有没有一个方便的命令行工具,可以用接近普通英语的方式解释C定义?我现在找不到那个工具。 - abelenky
K&R的《C程序设计语言》第二版第122页包含一个程序,可以将C语言声明翻译成易于理解的英文解释;http://packages.debian.org/sid/cdecl 可以在网上找到增强版。 - ephemient
cdecl。以下是一个实现示例:http://linux.maruhn.com/sec/cdecl.html - dmckee --- ex-moderator kitten
5个回答

10
如果我没记错的话...
你有一个多维数组 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

}

这在技术上是正确的,但并没有回答原始问题。 - Graeme Perrow
其实我是新来的。内存中发生的事情由某个东西指向。我提供了额外的信息,这并不离题。说“将ar地址指向arr [0] [0]”显然意味着“你只声明了一个指针,就像*p一样”。这是否符合格式?我问这个问题是因为我真的很好奇。 - JCasso
2
因为答案是正确的,所以点赞。仅仅因为它不是完全符合提问者的要求并不意味着它不值得被接受。 - Daniel Spiewak

8
它创建一个变量来存储指向int指针的指针。

7

编译器会预留四个字节的空间(在32位系统上,64位系统上则是八个字节)来存储一个指针(该指针指向另一个指针,后者指向int)。编译器不会进行进一步的内存分配,实际上将指针设置为指向存放int*/数组等的其他内存位置还需要由程序员来完成。


4

你声明了一个指针变量,所以你为一个内存地址分配了足够的空间(取决于你的平台/编译器等)。

类型系统将确保你只分配包含其他内存地址的地址,并且这些地址表示整数变量的实际地址。

要使用指向指针的指针,你需要解除引用一次(获取实际指向整数的地址),然后再解除引用一次(获取实际整数)。

你可以通过显式转换成其他类型(例如 i=&pDouble)来绕过类型系统,但除非你确定自己知道在做什么,否则不建议这样做。

如果你有一个二维数组,你可以将其概念化为表示行的单个一维数组的一系列单个一维数组。第一级间接引用将用于选择行,另一级间接引用将用于选择行中的单元格。


3

这是一个指向int指针的指针。通常用于声明二维数组,每个int指针都是一个数组,而双重指针是一个数组的数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接