int**vs int [ROWS] [COLS]

PKG*_*PKG 8 c c++

可能重复:
将char [] []转换为char**导致段错误?

我有一个像这样声明的2D数组:

int arr[2][2]={ {1,2},{3,4}};
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

int ** ptr=(int**) arr;
Run Code Online (Sandbox Code Playgroud)

和:

cout<<**ptr;
Run Code Online (Sandbox Code Playgroud)

我收到了分段错误(使用g ++ - 4.0).

为什么这样?不应该打印值1(等于arr[0][0])?

jwe*_*ich 5

您不能将线性数组转换为指向指针的类型,因为int**不能保存相同的数据int[][].第一个包含指向指针的指针.第二个在线性记忆中保存一系列整数.


t0m*_*13b 2

您正在尝试将双指针变量分配给数组...这已被详尽介绍,请参阅此处以获取有关此内容的信息。此外,既然你声明

int arr[2][2] = ...;

然后尝试分配arr给双指针

int ** ptr = ... ;

这肯定不起作用,因此会出现分段错误。此外,该语句int ** ptr=(int**) arr;实际上是将一种类型(即 [][])强制转换为另一种类型(即 **),尽管它们的类型是“int”。它们都是不同的,编译器的解释会非常不同......

你可以这样做:

int *ptr = &arr;

现在*(ptr + 1) 将引用第 0 行,*(ptr + 2)将引用第 1 行,依此类推。您唯一的责任是不要超越使用位置的标记arr,否则可能会发生溢出甚至分段错误......