欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组退化为指针--一个贵族的没落

程序员文章站 2023-12-31 15:06:04
...

首先来看这样一段代码:

#include<string>
#include <stdio.h>
#include<iostream>
using namespace std;
void each(int int_ref[10])
{
    cout<<sizeof(int_ref)<<endl;
    for(int i =0;i<10;++i)
    {
        cout<<int_ref[i]<<" ";
    }
    cout<<endl;
}

void each2(int (&int_ref)[10])
{
    cout<<sizeof(int_ref)<<endl;
    for(int i =0;i<10;++i)
    {
        cout<<int_ref[i]<<" ";
    }
    cout<<endl;
}
int main()
{
int szMsisdn[3];
cout<<sizeof(szMsisdn)<<endl;
int ref[10]={1,2,3,4,5,6,7,8,9,0};
each(ref);
each2(ref);
return 0;
}

这段代码运行的结果是:

12
4
1 2 3 4 5 6 7 8 9 0 
40
1 2 3 4 5 6 7 8 9 0 

其中值得注意的是:each函数的参数和each2的参数,一个是以数组名作为函数形参,一个是以数组引用做为函数形参。可以看出,前者的数组名退化为了指针。而且很遗憾,在失去其数组身份的同时,它还失去了其常量特性,即可以作自增、自减等操作,可以被修改。
所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

为什么说数组是贵族呢?

数组名可以看作是指针常量
根据结论2,数组名可以转换为指向其指代实体的指针,所以程序1中的第5行数组名直接赋值给指针,程序2第7行直接将数组名作为指针形参都可成立。

下面的程序成立吗?

1. int intArray[10];

2. intArray++;

这一段代码是不正确的。因为数组是一个指针常量,所以修改指针常量是不正确的!

上一篇:

下一篇: