int arr[] = { 3, 5, 9, 2, 8, 10, 11 };
int arrSize = *(&arr + 1) - arr;
std::cout << arrSize;
Run Code Online (Sandbox Code Playgroud)
我不知道这是如何工作的。所以任何人都可以帮助我解决这个问题。
为什么我们不能使用双指针来表示二维数组?
arr[2][5] = {"hello","hai"};
**ptr = arr;
Run Code Online (Sandbox Code Playgroud)
这里为什么双指针(**ptr)在这个示例中不起作用?
受到这个问题的启发:*(&arr + 1) - arr 如何给出数组 arr 元素的长度?
以下代码将计算数组的长度,尽管调用了未定义的行为:
int arr[] = {5, 8, 1, 3, 6};
size_t len = *(&arr + 1) - &arr[0]; // len is 5
Run Code Online (Sandbox Code Playgroud)
我相信,通过取消引用 (&arr + 1) 我们正在触发未定义的行为。但是,我们这样做的唯一原因是立即将结果衰减为int*,指向原始数组中最后一个元素之后的一个元素。由于我们没有取消引用这个指针,我们在定义的区域中很好。
因此,问题如下:是否有一种方法可以在int*不取消引用不可引用指针并保持定义的情况下衰减?
PS 强制免责声明:是的,我可以使用sizeof运算符和除法计算数组的大小。这不是问题的重点。
编辑: 我现在不太确定间接本身是未定义的。我发现http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232从它看起来似乎有试图使间接本身合法化,但我没有能够在实际标准中找到任何与此相关的措辞。
我正在练习实施容器。我的目标是定义迭代器begin(),end()
以便我可以使用for(auto x : v). 我的容器看起来像这样:
class Vector{
public:
Vector(initializer_list<double> numbers){
sz = numbers.size();
elem = new double[sz];
int i = 0;
for (auto it = numbers.begin(); it!=numbers.end(); ++it)
elem[i++] = *it;
}
~Vector(){delete [] elem;}
double* begin();
double* end();
private:
double* elem;
int sz;
};
Run Code Online (Sandbox Code Playgroud)
选项1
这就是我定义迭代器的方式(它们在我的测试用例中工作得很好)
double* Vector::begin(){
return elem;
}
double* Vector::end(){
return &elem[sz];
}
Run Code Online (Sandbox Code Playgroud)
选项 2
这就是它们在A Tour of C++中的定义
double* Vector::begin(){
return &elem[0];
}
double* Vector::end(){
return &elem[0]+sz; …Run Code Online (Sandbox Code Playgroud)