我已经看过它多次断言现在C++标准不允许使用以下代码:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
Run Code Online (Sandbox Code Playgroud)
&array[5]
在这种情况下是合法的C++代码吗?
如果可能的话,我想要一个参考标准的答案.
知道它是否符合C标准也很有趣.如果它不是标准的C++,为什么决定做出从不同的治疗呢array + 5
还是&array[4] + 1
?
我试图用指针理解一些东西,所以我写了这段代码:
#include <stdio.h>
int main(void)
{
char s[] = "asd";
char **p = &s;
printf("The value of s is: %p\n", s);
printf("The direction of s is: %p\n", &s);
printf("The value of p is: %p\n", p);
printf("The direction of p is: %p\n", &p);
printf("The direction of s[0] is: %p\n", &s[0]);
printf("The direction of s[1] is: %p\n", &s[1]);
printf("The direction of s[2] is: %p\n", &s[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用gcc编译时我得到以下警告:
$ gcc main.c -o main-bin -ansi -pedantic -Wall -lm
main.c: In function ‘main’: …
Run Code Online (Sandbox Code Playgroud) 我已经编程了很多年的c/c ++,但今天的偶然发现让我有点好奇......为什么两个输出在下面的代码中产生相同的结果?(arr
当然是地址arr[0]
,即指向arr[0]
.我本来希望&arr
是该指针的地址,但它具有相同的值arr
)
int arr[3];
cout << arr << endl;
cout << &arr << endl;
Run Code Online (Sandbox Code Playgroud)
备注:这个问题已经结束,但现在又被打开了.(谢谢 ?)
我知道&arr[0]
并arr
评估相同的数字,但这不是我的问题!问题是为什么&arr
和arr
评估相同的数字.如果arr
是文字(不存储任何软件),那么编译器应该抱怨并说这arr
不是左值.如果地址arr
存储在某个地方,那么&arr
应该给我该地点的地址.(但这种情况并非如此)
如果我写
const int*arr2 = arr;
那么arr2[i]==arr[i]
对于任何整数i
,但是&arr2 != arr
.