1.我的地址的地址 == 我的地址
先看个DEMO
BYTE byPinBottom[] =
{
0xff,0xff,0xfc,0x1f,0xfd,0x9f,0xfd,0x9f,
0xfd,0x9f,0xfd,0x9f,0xfd,0x9f,0xf0,0x07,
0xf0,0x07,0xff,0x7f,0xff,0x7f,0xff,0x7f,
0xff,0x7f,0xff,0x7f,0xff,0xff,0xff,0xff,
};
BYTE (* p1)[32] = NULL;
p1 = &byPinBottom;
现在的问题是p1应是byPinBottom的地址,但事实并不是如此
如果你在写面再一行
bool b = (int)p1 == (int)byPinBottom;
b 为 true;
刚开始感到很奇怪,这也TM太神。
后来才发现如果你从编译器开发者考虑这个问题,一切再也正常不过了。
因为byPinBottom从出生那一刻起,它就是一个栈地址,记住它是一个地址,你要一个地址的地址,那是没有这样玩的。如果你硬要地址,那也只能给你现在这个地址。
所以取数组的址址没有意义
2.一维数组与二维数组的区别。
由于我半路出家,长这么大还没上过一堂C语言课,所以在很早之前就建立了一个概念,就是二维数组,跟指针的指针是类似的,尽管也有些不一样。
最近碰了个壁,才发现,一开始的理解错的是如些的深,看下面一个例子
void Test(int * pArray, int nDim1, int nDim2)
{
int nValue = 0;
for(int i =0; i < nDim1; ++i)
{
for(int j = 0; j < nDim2; ++ j)
{
pArray[i * nDim1 + j] = nValue;
nValue ++;
}
}
}
int xx[16 * 16];
int xx2[16][16];
Test(xx, 16 ,16);
Test((int *)xx2, 16 ,16);
int bResult = memcmp(xx, (int *)xx2, 16*16);
可以看到bResult == 0,表明xx2本质上与一维数组是一样的。从基本上讲它们的内存结构就是一样的。
二维与一维本质的区别是,只是访问数据的方便性问题。