无法从int [] []转换为int *

时间:2010-04-21 12:52:03

标签: c++ arrays pointers

我有一个3x3数组,我正在尝试创建一个指针,我不断得到这个数组,是什么给出了?

如何定义指针?我已经尝试了[]和*。

的每个组合

是否可以这样做?

int tempSec[3][3];

int* pTemp = tempSec;

9 个答案:

答案 0 :(得分:15)

您可以执行int *pTemp = &tempSec[0][0];

如果要将3x3数组视为int *,则应该将其声明为int[9],并使用tempSec[3*x+y]代替tempSec[x][y]

或者,也许你想要的是int (*pTemp)[3] = tempSec?那将是指向tempSec的第一个元素的指针,第一个元素本身就是一个数组。

实际上,您可以使用指向2D数组的指针:

int (*pTemp)[3][3] = &tempSex;

然后你就这样使用它:

(*pTemp)[1][2] = 12;

这几乎肯定不是你想要的,但在你的评论中,你确实要求它......

答案 1 :(得分:6)

使用typedef

更容易
typedef int  ThreeArray[3];
typedef int  ThreeByThree[3][3];

int main(int argc, char* argv[])
{
    int         data[3][3];

    ThreeArray* dPoint    = data;
    dPoint[0][2]          = 5;
    dPoint[2][1]          = 6;   

    // Doing it without the typedef makes the syntax very hard to read.
    //
    int(*xxPointer)[3]    = data;
    xxPointer[0][1]       = 7;

    // Building a pointer to a three by Three array directly.
    //
    ThreeByThree*  p1     = &data;
    (*p1)[1][2]           = 10;

    // Building a pointer to a three by Three array directly (without typedef)
    //
    int(*p2)[3][3]        = &data;
    (*p2)[1][2]           = 11;

    // Building a reference to a 3 by 3 array.
    //
    ThreeByThree&  ref1   = data;
    ref1[0][0]            = 8;

    // Building a reference to a 3 by 3 array (Without the typedef)
    //
    int(&ref2)[3][3]      = data;
    ref2[1][1]            = 9;


    return 0;
}

答案 2 :(得分:3)

喔。这很简单!

int aai[3][3];
int* pi = reinterpret_cast<int*>(aai);

你可以使用这种超棒的技术将其转换为其他精彩类型。例如:

int aai[3][3];
int (__stdcall *pfi_lds)(long, double, char*) = reinterpret_cast<int (__stdcall *)(long, double, char*)>(aai);

这不仅仅是膨胀吗?问题是它是否有意义。

你问的是如何欺骗你的编译器。所以首先要知道的是:你为什么要撒谎?

答案 3 :(得分:0)

int a[20][30];
int* b=&a[0][0];

答案 4 :(得分:0)

原帖如下 - 请忽略,这是错误的。留给后人的缘故;)

然而,here is a link I found regarding memory allocation of 2-dimensional arrays in c++。也许它可能更有价值。


不确定它是你想要的,而且自从我编写c ++以来已经有一段时间了,但是你的转换失败的原因是你从一个数组数组转到一个int指针。另一方面,如果你尝试从数组到数组到指针指针,它可能会起作用

int tempSec[3][3]; 
int** pTemp = tempSec; 

请记住,你的数组数组实际上是一个连续的内存块,其中包含指向其他连续内存块的指针 - 这就是为什么将一个数组数组转换为一个int数组会得到一个看起来像垃圾的数组[垃圾真的是内存地址!]。

再次,取决于你想要什么。如果你想要它的指针格式,指针的指针是要走的路。如果您希望将所有9个元素作为一个连续数组,则必须对双数组执行线性化。

答案 5 :(得分:0)

史蒂夫指出,正确的形式是int *pTemp = &tempSec[0][0];int** pTemp2 = tempSec;不起作用。给出的错误是:

cannot convert 'int (*)[3]' to 'int**' in initialization

它不是作为指向数组的指针数组存储的。它存储为一个大向量,编译器会隐藏[a][b] = [a*rowLength+b]

#include <iostream>
using namespace std;
int main()
{
    // Allocate on stack and initialize.
    int tempSec[3][3];
    int n = 0;
    for(int x = 0; x < 3; ++x)
        for(int y = 0; y < 3; ++y)
            tempSec[x][y] = n++;

    // Print some addresses.
    cout << "Array base: " << size_t(tempSec) << endl;
    for(int x = 0; x < 3; ++x)
        cout << "Row " << x << " base: " << size_t(tempSec[x]) << endl;

    // Print contents.
    cout << "As a 1-D vector:" << endl;
    int *pTemp = &tempSec[0][0];
    for(int k = 0; k < 9; ++k)
        cout << "pTemp[" << k << "] = " << pTemp[k] << endl;
    return 0;
}

输出:

Array base: 140734799802384
Row 0 base: 140734799802384
Row 1 base: 140734799802396
Row 2 base: 140734799802408
As a 1-D vector:
pTemp[0] = 0
pTemp[1] = 1
pTemp[2] = 2
pTemp[3] = 3
pTemp[4] = 4
pTemp[5] = 5
pTemp[6] = 6
pTemp[7] = 7
pTemp[8] = 8

请注意,Row 0地址与完整数组地址相同,连续行偏移sizeof(int) * 3 = 12

答案 6 :(得分:0)

另一种方法是首先创建一个指针数组:

int* pa[3] = { temp[0], temp[1], temp[2] };

然后创建一个指向指针的指针:

int** pp = pa;

然后,您可以在该指针指针上使用常规数组语法来获取您正在寻找的元素:

int x = pp[1][0]; // gets the first element of the second array

此外,如果您尝试将其转换为指针的唯一原因是您可以将其传递给函数,则可以执行此操作:

void f(int v[3][3]);

只要数组的大小是固定的,您就可以将二维数组传递给这样的函数。它比传递指针更具体更多

答案 7 :(得分:0)

我们请cdecl.org为您翻译您的声明:

int tempSec[3][3]

返回

declare tempSec as array 3 of array 3 of int 


好的,那么我们如何创建指针呢?我们再问cdecl:

declare pTemp as pointer to array 3 of array 3 of int

返回

int (*pTemp)[3][3]


由于我们已经拥有int数组3的数组3,我们可以这样做:

int (*pTemp)[3][3] = &tempSec;

答案 8 :(得分:0)

int tempSec[3][3];

int* pTemp = tempSec[0];