我有一个3x3数组,我正在尝试创建一个指针,我不断得到这个数组,是什么给出了?
如何定义指针?我已经尝试了[]和*。
的每个组合是否可以这样做?
int tempSec[3][3];
int* pTemp = tempSec;
答案 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];