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本质上与一维数组是一样的。从基本上讲它们的内存结构就是一样的。
二维与一维本质的区别是,只是访问数据的方便性问题。