C语言貌似坑爹那点事情

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本质上与一维数组是一样的。从基本上讲它们的内存结构就是一样的。

二维与一维本质的区别是,只是访问数据的方便性问题。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值