我找到了一个计算数字平方的函数:
int p(int n) {
int a[n]; //works on C99 and above
return (&a)[n] - a;
}
它返回N2的值。问题是,它是怎么做到的?经过一些测试,我发现(&a)[k]
和(&a)[k+1]
是sizeof(a)
/sizeof(int)
。那是为什么?
发布于 2018-03-22 16:44:55
要理解这个黑客,首先需要理解指针的差异,即当两个指针指向同列被减去了吗?
当一个指针从另一个指针中减去时,结果是指针之间的距离(以数组元素度量)。所以如果p
指点a[i]
和q
指点a[j]
,然后p - q
等于i - j
当两个指针被减去时,两者都应指向同一数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。 换句话说,如果
P
和Q
分别指向i
-第四和j
-数组对象的第四个元素,表达(P)-(Q)
有价值i−j
如果该值与类型的对象相匹配ptrdiff_t
现在我希望您知道数组名称转换为指针,a
将指针转换为数组的第一个元素a,&a
是整个内存块的地址,即它是数组的地址。
这将帮助你理解为什么a
和&a
有相同的地址和方式(&a)[i]
是ith数组的地址
所以,声明
return (&a)[n] - a;
等于
return (&a)[n] - (&a)[0];
这个差异将给出指针之间的元素数。(&a)[n]
和(&a)[0]
,它们是n
数组nint
元素。因此,总数组元素是n*n
=n
2.
注:
如果减去两个指针,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素。结果是两个数组元素下标的差异。结果的大小是实现定义的。,它的类型(有符号整数类型)是
ptrdiff_t
中定义的<stddef.h>
头球。如果结果在该类型的对象中不可表示,则行为是未定义的。undefined
自(&a)[n]
既不指向同一个数组对象的元素,也不指向数组对象的最后一个元素,(&a)[n] - a
会调用未定义行为
还请注意,最好更改函数的返回类型。p
到ptrdiff_t
.
https://stackoverflow.com/questions/-100007736
复制相似问题