为什么值不同?C++指针
Why are the values different? C++ pointer
我正在谷歌搜索一个解决方案,以找出C++数组的长度。我找到的解决方案之一是这个
int arr[] = {1,2,3,4,5,6};
int size = *(&arr+1)-arr; //size is the length of the array
我在&arr
和arr
之间感到困惑,因为两者都给出了数组的基址。再次谷歌搜索,发现&arr + 1
给出了不属于数组的下一个内存块的地址,arr + 1
给出了数组中下一个元素的地址。
我编写了以下代码来测试&arr
和arr
之间的区别:
int arr[] = {1,2,3,4,5,6};
printf("value of &arr + 1 - &arr = %dn", &arr + 1 - &arr);
printf("value of *(&arr + 1) - arr = %dn", *(&arr + 1) - arr);
第一个printf
的答案是1
第二个printf
给出6
。这是让我感到困惑的部分:既然&arr
和arr
都保存同一数组的基址,为什么结果不同?
既然"&arr"和"arr"都保存同一数组的基址,为什么结果不同?
因为类型不同。指针算术受指针类型的影响,更具体地说,受指向对象的类型的影响。
&arr
是指向 6 int 数组的指针。将 1 添加到该数组中将递增到下一个 6 int 数组(如果它是数组数组的元素(。
arr
虽然是一个数组,但在使用数组的值时(例如在指针算术表达式中(衰减为指向数组第一个元素的指针。衰减的值是指向 int 的指针,将 1 加法会将指针移动到下一个整数。
附言您可以改用std::size
。或者std::extent
C++ 17 之前。或者sizeof arr / sizeof *arr
C++11 之前。
*(&arr + 1) - arr
可能有效,但从技术上讲,通过过去结束的指针(指向不存在的对象(间接,这通常是未定义的行为。我不确定考虑到该值仅用于衰减到指针,该规则是否可能存在一些例外。
&arr 和 arr 是不同的指针。 arr 是数组 "arr" 的第一个元素的地址。 但是 &arr 是指针 arr 的地址。在 &arr 地址中有数组"arr"的地址。 所以它是数组地址的地址。 因此,&arr 是不可预料的,而 *(&arr + 1( 也是不可预料的。 因为我们不知道哪个值保存在 &arr 的下一个地址中。
让我解释一下你的两个printf声明。 &arr + 1 - &arr 始终返回 1。因为它在 &arr 中添加 1 并再次减去 &arr,所以结果是 1。 *(&arr + 1( - arr 返回意外的结果。因为 *(&arr + 1( 是不可预料的,而 arr 也是不可预料的,所以结果是不可预料的。
这就是为什么这两个结果是不同的。
很抱歉不是用户友好的答案。 谢谢,最好的问候。
金毅.
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错