天天看点

将一行空格分隔的整数读入动态数组

将一行空格分隔的整数读入数组,发现了mingw和msvc两种编译器定义动态数组的区别

初学动态数组很可能想当然的就定义成了下面这个亚子:

int n;
cin>>n;
int array[n];
           

结果发现在某些IDE下是可以使用的,但很奇怪的的是在VS上用不了这种写法

标准的定义应该写成这个亚子:

int n;
cin>>n;
int* array=new int[n];
           

原因来了,原因来了,原因来了:

这样定义动态(变长)数组C++ 标准不支持, GNU 方言支持,另外 C99 及之后版本的 C 标准也支持。

可以说第一种写法是方言版的,亲测在配置MinGW编译器的IDE上可用这种写法,MSVC编译器不支持。

这两种区别就在于:可以理解为这两个array一个是“对象”,一个是指针

下面用一个输入的例子来看两种区别:

输入为:

6

15 75 12 36 25 33

———————————————————————————————————————————————

第一种(方言版):

int main()
{
    int n;
    cin>>n;
    cin.ignore();	//清理'\n'
    int a[n];
    int i = 0;
    char c;
//将一行空格分隔开的整数,存到数组
    while((c=getchar())!='\n')
    {
        if(c!=' ')
        {
            ungetc(c,stdin);
            cin>>a[i++];
        }
    }
    cout<<sizeof(a)<<endl;
    cout<<sizeof(a[0])<<endl;
    for(int j=0;j<i;j++)
    {
        cout<<"a["<<j<<"]:"<<a[j]<<endl;
    }
    return 0;
}
           

结果为:

将一行空格分隔的整数读入动态数组

明显看到 sizeof(a) 的大小为整个数组的大小,第一个元素的大小为sizeof(a[0]),4×6=24,此时的int a[n] 的 a 理解为整个动态数组“对象"

——————————————————手动分割~—————————————————————————

第二种(c++标准):

int main()
{
    int n;
    cin>>n;
    cin.ignore();	//清理'\n'
    int *a=new int[n];
    int i = 0;
    char c;
//将一行空格分隔开的整数,存到数组
    while((c=getchar())!='\n')
    {
        if(c!=' ')
        {
            ungetc(c,stdin);
            cin>>a[i++];
        }
    }
    cout<<sizeof(a)<<endl;
    cout<<sizeof(a[0])<<endl;
    for(int j=0;j<i;j++)
    {
        cout<<"a["<<j<<"]:"<<a[j]<<endl;
    }
    return 0;
}
           

结果为:

将一行空格分隔的整数读入动态数组

明显的看到 sizeof(a)=4=sizeof(a[0]),居然和数组内第一个元素大小相同,但数组总共有6个元素,大小理应为24,于是看到有 int* a=new int[n] 这一句就明白了,是int* a 让a指向了动态数组的首址,sizeof(a) 返回的就是首元素的大小。

个人感觉方言版有点像python,想啥写啥,是怎么回事。。。

继续阅读