char c='c';
char *pc = &c;
char a[]="123456789";
char *p = &(a[1]);
cout <<"the size of the a: "<< sizeof (a)<< endl; //10
cout <<"the size of the p: "<< sizeof (p)<< endl; //4
cout << p[100] <<endl;//cross boundary intentionally
cout << pc[0];//c
cout << pc[1];
编译器不再将 p 视为数组?编译器如何验证它是否是一个数组? p 和 pc 之间有什么区别吗?
感谢!!!!
答案 0 :(得分:1)
编译器不再将p视为数组?
它从未将其视为数组,因为它不是。它总是一个指针。 数组不是指针。阅读本文,接受它,拥抱它!它们有时会衰减成指针(当作为参数传递时),但它们不是指针。
p和pc之间有什么区别吗?
类型 - 没有。它们的不同之处在于它们指向不同的char
。
此外,pc[1]
是未定义的行为。您只拥有直接指向的内存pc
- 即包含字符'c'
的单个字节。同样适用于p[100]
。
答案 1 :(得分:1)
编译器将数组仅视为声明为数组的变量,即使用方括号。但是,指针不是数组,尽管您可以将数组名称视为构造指针表达式的指针。
答案 2 :(得分:1)
如果您想使用编译器检查数组边界的数组结构,可以使用std::vector
。例如
#include <vector>
int main()
{
int array[]={0,1,2,3,4,5};
std::vector<int> vec;
vec.assign(array, array+6);
for(unsigned int i=0; i<vec.size(); ++i)
{
std::cout << vec.at(i);
}
return 0;
}
这里,vec.at(i)检查向量的边界。如果使用vec [i],这也是有效的,但编译器不检查边界。希望有所帮助。
答案 3 :(得分:0)
编译器不能也不会将p视为数组。 p只是指向可以分配任何地址的char的指针。为什么编译器会将其视为数组?