sony a6000l和a6300:这里没有定义指针而直接对其进行指针运算是否错误?

来源:百度文库 编辑:神马品牌网 时间:2024/05/01 00:38:32
long b[2][3][4];
*( *( *( b + 1 ) + 1 ) + 1 ) = 5;

摘自以下内容:
long a = 0; long *p = &a, **pp = &p; long b[2][3][4];
假设上面a映射的是3000,则p就映射3004,pp就映射3008,而b映射3012。如上赋值后,a的值为0,类型为long;p的值为3000,类型为long*;pp的值为3004,类型为long**;b的值为3012,类型为long[2][3][4]。
对于*( *( pp + 1 ) ) = 5;,pp返回类型为long**的数字3004,而原类型long*的长度是4个字节,故pp + 1返回类型为long**的数字3008,而*( pp + 1 )仅转换类型,返回类型为long*的地址类型的数字3008,返回类型为long*的数字3004,故*( *( pp + 1 ) )返回类型为long的地址类型的数字3004,而*( *( pp + 1 ) ) = 5;则将5按照long的存放规则放到3004所标识的内存中,结果p的值变为5而不再是3000(运气极好地5是正数,此时long类型的数字转换规则和long*一样),进而如果再继续*p = 1;将错误(应注意上面是假设编译器顺序安放a、p和pp,进而使pp的地址较p多4。不同的编译设置和编译器将不一定如上顺序安放局部变量,则*( *( pp + 1 ) ) = 5;将有可能失败)。
对于*( *( *( b + 1 ) + 1 ) + 1 ) = 5;,b返回类型为long[2][3][4]的数字3012,原类型为long[3][4],则b + 1将先进行隐式类型转换以将3012转换为long(*)[3][4],而sizeof(long[3][4])=48字节,则b + 1将返回类型为long(*)[3][4]的数字3012+48=3060,而*( b + 1 )返回类型为long[3][4]的地址类型的数字3060,再返回类型为long[3][4]的数字3060。则*( b + 1 ) + 1返回类型为long(*)[4]的数字3060+sizeof(long[4])=3076,同理,*( *( *( b + 1 ) + 1 ) + 1 )返回long类型的地址类型的数字3076+sizeof(long)=3080,将5放在3080所标识的内存中。由前面对“[]”的说明可知*( *( *( b + 1 ) + 1 ) + 1 ) = 5;等效于b[1][1][1] = 5;,可如上自行推验。应注意虽然b是多维数组,但它仍是一块连续的内存空间。
为什么要有多级指针和多维数组?long a[3][4];和long a[12];都是分配一块连续的48字节内存空间,它们有什么区别?何时用前者何时用后者?在《C++从零开始》系列中强调要按语义编写程序,因此只要明确指针和数组的语义就能有条理地使用它们了。

定义了数组不就有指针了...