编译器如何处理数组声明

时间:2012-11-28 04:03:22

标签: c++ arrays pointers

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 之间有什么区别吗?

感谢!!!!

4 个答案:

答案 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的指针。为什么编译器会将其视为数组?