new*_*bie 4 c++ arrays pointers
我正在寻找一种解决方案,以找出C ++中数组的长度。我发现的解决方案之一是
int arr[] = {1,2,3,4,5,6};
int size = *(&arr+1)-arr; //size is the length of the array
Run Code Online (Sandbox Code Playgroud)
我之间感到困惑&arr,arr因为两者都给出了数组的基地址。再次进行Google搜索,发现&arr + 1给出了不属于数组一部分的下一个内存块arr + 1的地址,其中给出了数组中下一个元素的地址。
我编写了以下代码来测试&arr和之间的区别arr:
int arr[] = {1,2,3,4,5,6};
printf("value of &arr + 1 - &arr = %d\n", &arr + 1 - &arr);
printf("value of *(&arr + 1) - arr = %d\n", *(&arr + 1) - arr);
Run Code Online (Sandbox Code Playgroud)
在回答第一个printf是1在那里作为第二printf给出6。这是混淆了我的部分:由于这两种&arr与arr持有相同阵列的基址,为何结果不同?
由于“&arr”和“ arr”都拥有相同数组的基地址,因此结果为何不同?
因为类型不同。指针算术受指针类型(尤其是指向对象的类型)影响。
&arr是指向6个int数组的指针。将1加到下一个6个int数组(如果它是数组数组的一个元素)。
arr(虽然是数组),但在使用数组的第一个元素(例如在指针算术表达式中)的值时,会衰减到指向该数组第一个元素的指针。衰减后的值是一个指向int的指针,将其加1会将指针移至下一个整数。
PS您可以std::size改用。或std::extentC ++ 17之前的版本。或sizeof arr / sizeof *arrC ++ 11之前的版本。
*(&arr + 1) - arr可能有效,但是从技术上讲是通过过去指针(指向不存在的对象)间接进行的,这通常是未定义的行为。考虑到该值仅用于衰减到指针,我不确定该规则是否存在某些例外。
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |